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

时间:2014-11-13 23:08:53

标签: memory rust

在下面的代码中,退出“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"
}

1 个答案:

答案 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的唯一引用时才有效,但不同大多数垃圾收集/管理语言都是静态确定的,而不是动态确定的(这是所有权和线性/仿射类型的直接结果)。