当重新分配包含它的变量时,分配会发生什么?

时间:2018-02-08 20:18:50

标签: memory memory-management memory-leaks scope rust

我很确定有一个专门的名字,但我不知道它是什么。

当你有一个停止指向有效对象的指针时,这是一个悬空指针,但是没有引用它的对象呢,特别是在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 ++中一样吗?

1 个答案:

答案 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没有这样的概念,并且必须明确地释放内存。