根据this chapter in the Rust Book,可以通过创建一个指针循环来泄漏内存:
锈迹斑斑的内存安全性保证使意外创建从未清除过的内存变得困难,但并非不可能(称为内存泄漏)。完全禁止内存泄漏并不是Rust的保证之一,就像在编译时禁止数据竞争一样,这意味着内存泄漏在Rust中是内存安全的。我们可以看到,Rust通过使用
const userNumber = numbers.of('193619554647618082227851');
和Rc<T>
允许内存泄漏:可以创建引用,其中项目在一个周期中相互引用。这会造成内存泄漏,因为循环中每个项目的引用计数永远不会达到0,并且这些值也永远不会被丢弃。
存在诸如“弱指针”之类的替代方法,这些替代方法使您可以创建自引用结构,这些结构在删除后仍可以清除。实际上,本章稍后实际上建议使用RefCell<T>
。
为什么Rust认为这很安全?为什么在这种情况下该语言没有采取任何措施来防止“不良的程序员行为”?
答案 0 :(得分:7)
因为它很安全。
unsafe
在Rust中有非常特殊的含义,它专门针对触发未定义行为的编程错误类别。这些是最令人讨厌的错误,因为它们完全破坏了您对程序的整体理解,从而使编译器或硬件都无法预测地运行。
内存泄漏不会触发未定义行为,因此很安全。
您可能对Nomicon(相当于Rust Book的不安全版本)关于Leaking的说法感兴趣;关于ScopeGuard
的示例通常称为“泄漏启示录”。
值得注意的是,例如,垃圾收集的语言很容易泄漏内存。一个简单的Map
,其中添加键-值对而从未删除它们将最终导致堆耗尽。并且GC将无法停止它。
不断增长的Map
就像反复忘记忘记free
指针一样不受欢迎,无论哪种情况,堆耗尽的隐患都是存在的,但GC语言通常被认为是安全的。