如何释放 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());
}
正如其他人所指出的,在大多数情况下没有必要做这种事情,因为大多数全局变量的要点是持续到程序结束,在这种情况下内存将被回收通过 OS 即使析构函数从未运行。
如果全局变量与您在程序中的某个点后不再需要的资源相关联,则以上内容会很有用。
文档指出如果类型有析构函数,则不会调用它: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());
}
正如其他人所指出的,在大多数情况下没有必要做这种事情,因为大多数全局变量的要点是持续到程序结束,在这种情况下内存将被回收通过 OS 即使析构函数从未运行。
如果全局变量与您在程序中的某个点后不再需要的资源相关联,则以上内容会很有用。