【发布时间】:2018-02-08 20:18:49
【问题描述】:
我很确定它有一个专门的名称,但我不知道它是什么。
当你有一个停止指向一个有效对象的指针时,这就是一个悬空指针,但是一个没有对它的引用的对象呢,尤其是在 Rust 中?
以如下代码为例:
{
let mut v: Vec<u32> = vec![1, 2, 3];
v = Vec::new();
v.push(0);
}
当v 被重新分配给一个全新的向量时,旧向量会发生什么?在 C/C++ 中,这是内存泄漏的诞生,因为没有人会释放该内存,而您也不再有办法这样做。然而,在 Rust 中,退出作用域时会发生各种魔法(因此示例代码中的 {}。
从逻辑的角度来看,由于 Rust 没有 GC,这将表明向量只保留在内存中直到进程终止,当超出范围时扫描无法访问的对象会影响实际的 GC,但我没有但对 Rust 的内部结构有足够的了解,可以做出这些猜测(尽管我想在某个时候这样做)。
上面的代码到底发生了什么?是不是像在 C/C++ 中一样需要注意内存泄漏?
【问题讨论】:
-
"在 C/C++ 中,这是内存泄漏的诞生,因为没有人会释放该内存,而您也没有办法这样做。"在 C++ 中,
vector::operator=将释放旧内存,因此不会有泄漏。在 C 中没有向量,您根本无法分配给数组,因此您将无法编写这样的代码。 -
operator=的正确实现应该始终正确处理内存。如果没有,请远离这种类型。 -
所有不是使用
new直接创建或损坏的东西,都会在 C++ 中自行清理。要创建内存泄漏,您必须使用指向动态分配内存的原始指针。一旦你意识到这一点并尝试在 Rust 中做同样的事情,你会发现 Rust 不允许你触摸unsafe块之外的原始指针。 -
@trentcl 在你的第二个例子中(我相信它代表了阴影)——看起来内存被保留在堆栈上(未释放),直到modified 2 中的范围结束。所以如果你运行一个大循环——这种方法可能会积累相当大的“临时内存泄漏”,对吧?
标签: memory memory-management memory-leaks scope rust