3

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

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

4

2 回答 2

7

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

这个问题甚至没有错。

lazy_static 的全部意义在于对象永远存在,这就是静态,什么时候可以释放任何东西?该注释用于 non-memory Drop,以表明如果您将lazy_static其用于文件或临时文件,它们将不会在程序退出时被刷新/删除/……。

对于内存的东西,它会在程序退出时被系统回收,就像所有的内存一样。

于 2021-08-20T18:27:49.967 回答
3

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

制作你lazy_static的 an ,并在不再需要时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());
}

操场

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

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

于 2021-08-20T20:52:32.463 回答