Rust 中的盒子类型在没有引用时会自动释放吗?

jef*_*ime 3 memory rust

在下面的代码中,退出“主”作用域时“box 5i”是否得到正确释放?他们的指针指南上的措辞似乎表明,当变量超出范围时,具有盒类型的变量就像自动调用“free()”一样。但是,如果您在这段代码中对“a”进行“free()”,最终只会释放堆上的“box 8i”。“a”最初指向的“box 5i”会发生什么?

fn foo(a: &mut Box<int>) {
    *a = box 8i;
}

fn main() {
    let mut a = box 5i;
    println!("{}", a); // -> "5"
    foo(&mut a);
    println!("{}", a); // -> "8"
}
Run Code Online (Sandbox Code Playgroud)

huo*_*uon 6

默认情况下,覆盖内存位置将运行旧值的析构函数。因为Box<...>这涉及运行内容的析构函数(这对于 来说没什么意义int)并释放分配,因此如果ahas type &mut Box<T>*a = box value则相当于(在 C 中):

T_destroy(**a);
free(*a);
*a = malloc(sizeof T);
**a = value;
Run Code Online (Sandbox Code Playgroud)

从某种意义上说,你的问题的答案是肯定的,因为类型系统保证只有*a = box ...a是对 old 的唯一引用时才能工作Box,但与大多数垃圾收集/托管语言不同,这都是静态确定的,而不是动态确定的(它是所有权和线性/仿射类型的直接结果)。