如何在lazy_static中释放内存?

3

这是所有 Rust static 变量的行为,不仅仅是 lazy_static。请参阅 Rust 参考中的[静态变量] (https://doc.rust-lang.org/reference/items/static-items.html):“在程序结束时,静态项不会调用 drop”。 - kmdreko
2个回答

8
那我该如何释放内存?
这个问题本身就是错误的。 lazy_static 的整个重点在于对象永久存在,这就是静态所表示的,任何时候都不需要释放什么。笔记中为非内存 Drop 提供提示,以指示如果您将 lazy_static 用于文件或临时文件,则它们将不会在程序退出时被清空/删除/…。
对于内存相关的内容,它将在程序退出时由系统回收,就像所有内存一样。

如果我想存储实现了析构函数以释放内存的东西怎么办?比如一个Arc?更糟糕的是,一个带有Mutex和Box的Arc。Box不会释放堆中的内容。 - gnevesdev
3
@gnevesdev,如果使用静态变量会有什么功能性区别呢?唯一可想象的时候静态变量会被销毁是在程序结束时,而此时所有内存都将被操作系统回收。 - kmdreko
@kmdreko 这并不意味着这不是一个问题。在其他情况下(比如在操作系统之外),内存可能会泄漏。 - gnevesdev
2
@gnevesdev 再次问一下,这会有什么功能上的区别吗?特别是在没有操作系统的裸机应用中,任何正在使用的内存在程序结束后对系统都没有影响。 - kmdreko

4
那么我应该如何释放内存?
将你的 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

就像其他人指出的那样,在大多数情况下没有必要这样做,因为大多数全局变量的目的是持续到程序结束,即使析构函数从未运行,内存也将被操作系统回收。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接