是否有可能导致Rust发生内存泄漏?

New*_*yte 6 memory memory-leaks rust

有什么方法可以在Rust中引起内存泄漏吗?我知道即使在JavaScript之类的垃圾收集语言中,也有一些极端情况会导致内存泄漏,Rust中有这种情况吗?

the*_*ian 15

书中

Rust 的内存安全保证使得意外创建永远不会被清理的内存(称为内存泄漏)变得困难,但并非不可能。完全防止内存泄漏不是 Rust 的保证之一,就像在编译时禁止数据竞争一样,这意味着内存泄漏在 Rust 中是内存安全的。

所以答案是肯定的。您的代码中可能存在内存泄漏,而 Rust 编译器不会抱怨它。


Fre*_*ios 8

是的,Rust中的内存泄漏与调用std::mem::forget函数一样容易。

如果创建一个共享引用循环,也可能泄漏内存:

Rc指针之间的循环永远不会被释放。因此,Weak用于中断周期。例如,一棵树可以具有Rc从父节点到子节点的强指针,以及从子节点到其父节点的Weak指针。

您还可以Box::leak用于创建静态引用,或者Box::into_raw在FFI情况下。


所有这些示例表明,内存泄漏不会破坏Rust保证的内存安全性。但是,可以肯定地认为,在Rust中,除非您执行了一些“非常特殊的操作”,否则没有任何内存泄漏。

另外,请注意,如果您对内存泄漏采用了宽松的定义,则可以通过多种方式创建内存泄漏,例如,通过在容器中添加一些数据而不释放未使用的数据。

  • 出于好奇,在网上搜索一下就会发现“FFI”代表“外部函数接口”。:)(对于 Rust 初学者来说并不明显。) (4认同)
  • 你可能已经忘记了 [`Box::leak`](https://doc.rust-lang.org/std/boxed/struct.Box.html#method.leak) 和 [`Box::into_raw`] (https://doc.rust-lang.org/std/boxed/struct.Box.html#method.into_raw)这在 ffi 情况下传递状态非常常见。 (2认同)
  • 也许“内存泄漏”这个术语最初意味着忘记调用“free”,但这实际上只是程序如何意外耗尽内存的更大图景的一部分。忘记直接调用“free”和忘记做一些会间接触发调用“free”的事情会产生相同的后果 (2认同)