【问题标题】:Are box types in Rust automatically freed when they have no references?Rust 中的盒子类型在没有引用时会自动释放吗?
【发布时间】:2014-11-13 23:08:52
【问题描述】:

在下面的代码中,“box 5i”在退出“main”作用域时是否被正确释放?他们pointer guide 上的措辞似乎表明,当变量超出范围时,具有框类型的变量就像有一个自动的“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"
}

【问题讨论】:

    标签: memory rust


    【解决方案1】:

    默认情况下,覆盖内存位置将运行旧值的析构函数。对于Box&lt;...&gt;,这涉及运行内容的析构函数(这对于int 来说没什么)并释放分配,所以如果a 的类型为&amp;mut Box&lt;T&gt;*a = box value 相当于(在C 中):

    T_destroy(**a);
    free(*a);
    *a = malloc(sizeof T);
    **a = value;
    

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

    【讨论】:

    • 谢谢!我知道在程序运行时它没有被垃圾收集,这就是为什么我不知道原始盒子是否被自动释放。我仍在努力掌握这个终身模型
    • @MatthieuM。啊,对不起,错字。根据问题,我的意思是a: &amp;mut Box&lt;T&gt;。 (固定。)
    猜你喜欢
    • 2015-03-24
    • 2023-03-04
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2017-03-05
    相关资源
    最近更新 更多