如何释放 lazy_static 中的内存?

How do I free memory in a lazy_static?

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

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

So how am I supposed to free the memory?

这个问题并没有错。

lazy_static 的全部要点是对象永远存在,这就是 static,什么时候会释放任何东西?注释用于非内存 Drop,以表明如果例如您将 lazy_static 用于文件或临时文件,它们不会在程序退出时被刷新/删除/……。

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

So how am I supposed to free the memory?

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

Playground

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

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