【发布时间】:2019-09-30 02:49:20
【问题描述】:
根据this chapter in the Rust Book,有可能通过创建指针循环来泄漏内存:
Rust 的内存安全保证使得意外创建从未清理过的内存(称为内存泄漏)变得困难,但并非不可能。完全防止内存泄漏并不是 Rust 的保证之一,就像在编译时不允许数据竞争一样,这意味着内存泄漏在 Rust 中是内存安全的。我们可以看到 Rust 通过使用
Rc<T>和RefCell<T>允许内存泄漏:可以创建引用,其中项目在循环中相互引用。这会造成内存泄漏,因为循环中每个项目的引用计数永远不会达到 0,并且值永远不会被丢弃。
存在诸如“弱指针”之类的替代方案,可让您创建自引用结构,在删除时仍可清理这些结构。事实上,使用Weak<T>实际上是在那一章后面提出的。
为什么 Rust 认为这是安全的?为什么这是一个语言没有做任何事情来防止“不良程序员行为”的例子?
【问题讨论】:
-
您为什么认为这样做不安全?它会破坏 Rust 提供的任何保证吗?它是否以任何方式影响控制流?以后可以以任何方式访问被遗忘的字节吗? :)
-
除了你已经引用的那本书的部分,我认为这方面没什么可说的。 “内存泄漏是内存安全的” 是正确的答案。
-
@hellow 事情就是这样:我曾预料到“忘记”东西(将事物“永远”保存在内存中而不运行它们的析构函数)是不可取的,我惊讶地发现确实是 Rust 的保证不说这种情况,这也是我问这个问题的原因。
标签: pointers memory-leaks rust