什么时候为不再拥有的资源回收存储?

Ant*_*ida 6 ownership-semantics rust

在下面的程序的第2行中分配了一个矢量资源.程序结束时,不拥有矢量资源.如果资源根本不归属,那么它何时被回收?是否有使用Rust所有权语义和生命周期术语的解释可能使程序员相信该资源确实被回收了?

fn main() {
    let mut v = vec![1,2];
    v = vec![3, 4];
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 7

什么时候[无主资源]被收回?

在Rust术语中,项目在超出范围时被删除,范围通常(但不总是)对应于块的结尾.删除时,也会释放属于该项目的任何资源.

资源可以表示内存,如向量示例中所示,但它也可以对应于其他内容,如文件句柄或锁.这通常称为资源获取初始化(RAII).

说服程序员这个资源确实被收回了吗?

你永远无法说服真正不想相信的人^ _ ^.但是,您可以Drop自己实现以查看项目被删除的时间:

struct NoisyDrop(u8);

impl Drop for NoisyDrop {
    fn drop(&mut self) {
        println!("Number {} being dropped", self.0);
    }
}

fn main() {
    println!("step 1");
    let mut nd = NoisyDrop(1);
    println!("step 2");
    nd = NoisyDrop(2);
    println!("step 3");
}
Run Code Online (Sandbox Code Playgroud)

这将有输出

step 1
step 2
Number 1 being dropped
step 3
Number 2 being dropped
Run Code Online (Sandbox Code Playgroud)

您可以看到第一个变量在更换其绑定时被删除,因为不再有任何方法可以获取该NoisyDrop(1)值.由于方法结束,第二个变量在超出范围时被删除.

所有权语义和生命周期

考虑这个例子:

fn main() {
    let mut v = vec![1];
    v = vec![2];
}
Run Code Online (Sandbox Code Playgroud)

从概念上讲,它可以写成

fn main() {
    {
        let v = vec![1];
    }
    {
        v = vec![2];
    }
}
Run Code Online (Sandbox Code Playgroud)

而这个例子

fn main() {
    let v1 = vec![1];
    let v2 = vec![2];
}
Run Code Online (Sandbox Code Playgroud)

可以改写为

fn main() {
    {
        let v1 = vec![1];
        {
            let v2 = vec![2];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这些重写显示了每个变量的生命周期.每当使用泛型生命周期参数调用方法时,块的生命周期将是替换'a泛型的具体值.