在下面的代码中,退出“主”作用域时“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)
默认情况下,覆盖内存位置将运行旧值的析构函数。因为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,但与大多数垃圾收集/托管语言不同,这都是静态确定的,而不是动态确定的(它是所有权和线性/仿射类型的直接结果)。