在下面的代码中,退出“main”范围时,“box 5i”是否正确释放? pointer guide上的措辞似乎表明,当变量超出范围时,带有框类型的变量就好像有一个自动的“free()”调用。但是,如果您在此代码中的“a”上“free()”,它最终将释放堆上的“box 8i”。 “a”最初指向的“方框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"
}
答案 0 :(得分:4)
默认情况下,覆盖内存位置将运行旧值的析构函数。对于Box<...>
,这涉及运行内容的析构函数(这不是int
)并释放分配,因此如果a
具有类型&mut Box<T>
,{{1} }相当于(在C中):
*a = box value
从某种意义上说,问题的答案是肯定的,因为类型系统保证T_destroy(**a);
free(*a);
*a = malloc(sizeof T);
**a = value;
仅在*a = box ...
是对旧a
的唯一引用时才有效,但不同大多数垃圾收集/管理语言都是静态确定的,而不是动态确定的(这是所有权和线性/仿射类型的直接结果)。