提问人:gnevesdev 提问时间:8/21/2021 更新时间:10/28/2021 访问量:1049
如何释放lazy_static中的内存?
How do I free memory in a lazy_static?
答:
8赞
Masklinn
8/21/2021
#1
那么我应该如何释放内存呢?
这个问题甚至没有错。
lazy_static的全部意义在于,物体是永远存在的,这就是静态,什么时候才能释放任何东西?注释是针对非内存的,以表明例如,如果您用于文件或临时文件,则它们不会被刷新/删除/...在程序退出时。Drop
lazy_static
对于内存,它将在程序退出时被系统回收,就像所有内存一样。
评论
0赞
gnevesdev
8/21/2021
如果我想存储实现析构函数以释放内存的内容,该怎么办?像弧一样?更糟糕的是,一个带有互斥锁的 Arc 和一个带有东西的盒子。盒子不会释放堆的东西。
3赞
kmdreko
8/21/2021
@gnevesdev它会有什么功能上的区别?唯一可以想象的静态变量被销毁的时间是在程序的末尾,在这一点上,操作系统将回收所有程序的内存。
0赞
gnevesdev
8/21/2021
@kmdreko这并不意味着这不是问题。在其他情况下(例如在操作系统之外),内存可能会泄漏。
2赞
kmdreko
8/21/2021
@gnevesdev,它又会带来什么功能上的区别?特别是在无操作系统的裸机应用程序中,程序结束后,正在使用的任何内存都不会对系统产生影响。
4赞
user4815162342
8/21/2021
#2
那么我应该如何释放内存呢?
使你成为 ,并在不再需要内存时调用以释放内存。例如:lazy_static
Option
take()
lazy_static! {
static ref LARGE: Mutex<Option<String>> =
Mutex::new(Some(iter::repeat('x').take(1_000_000).collect()));
}
fn main() {
println!("using the string: {}", LARGE.lock().as_ref().unwrap().len());
LARGE.lock().take();
println!("string freed")
assert!(LARGE.lock().is_none());
}
正如其他人所指出的,在大多数情况下没有必要做这种事情,因为大多数全局变量的点是持续到程序结束,在这种情况下,即使析构函数从未运行,操作系统也会回收内存。
如果全局变量与程序中某个点以后不再需要的资源相关联,则上述方法可能很有用。
评论
static
lazy_static