我很确定有一个专门的名字,但我不知道它是什么。
当你有一个停止指向有效对象的指针时,这是一个悬空指针,但是没有引用它的对象呢,特别是在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 ++中一样吗?
答案 0 :(得分:3)
Rust(就像C ++一样)使用RAII来处理这个问题。需要销毁的类型实现Drop
特征(在C ++中,它们有一个析构函数),当变量超出范围时会自动调用。
在Rust:
{
let a = foo();
a = b; // `b` is moved to `a`,
// the previous value of `a` is dropped, which frees memory
} // `a` goes out of scope, it is dropped, which frees memory
在C ++中:
{
auto a = foo();
a = b; // `=` is essentially a function call,
// but a proper `=` implementation should handle memory properly
} // `a` goes out of scope, its destructor is called, which frees memory
对于Rust或C ++中正确实现的类型,没有内存泄漏。 另一方面,C没有这样的概念,并且必须明确地释放内存。