如何释放lazy_static中的内存?

How do I free memory in a lazy_static?

提问人:gnevesdev 提问时间:8/21/2021 更新时间:10/28/2021 访问量:1049

问:

文档指出,如果类型具有析构函数,则不会调用它: https://docs.rs/lazy_static/1.4.0/lazy_static/#semantics

那么我应该如何释放内存呢?

记忆 惰性静态

评论

0赞 kmdreko 8/21/2021
这是所有 Rust 变量的行为,而不仅仅是 .参见 Rust 参考中的静态项:“静态项不会在程序末尾调用 drop”staticlazy_static

答:

8赞 Masklinn 8/21/2021 #1

那么我应该如何释放内存呢?

这个问题甚至没有错。

lazy_static的全部意义在于,物体是永远存在的,这就是静态,什么时候才能释放任何东西?注释是针对非内存的,以表明例如,如果您用于文件或临时文件,则它们不会被刷新/删除/...在程序退出时。Droplazy_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_staticOptiontake()

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());
}

操场

正如其他人所指出的,在大多数情况下没有必要做这种事情,因为大多数全局变量的点是持续到程序结束,在这种情况下,即使析构函数从未运行,操作系统也会回收内存。

如果全局变量与程序中某个点以后不再需要的资源相关联,则上述方法可能很有用。