gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:05:39 25 4
gpt4 key购买 nike

在下面的代码中,“box 5i”是否在退出“main”作用域时被正确释放?他们的措辞pointer guide似乎表明具有框类型的变量在变量超出范围时就像自动调用“free()”一样。但是,如果您在此代码中对“a”“释放()”,它最终只会释放堆上的“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"
}

最佳答案

默认情况下,覆盖内存位置将运行旧值的析构函数。对于 Box<...>这涉及运行内容的析构函数(这对于 int 没有任何意义)并释放分配,所以如果 a类型为 &mut Box<T> , *a = box value等同于(在 C 中):

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

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

关于memory - Rust 中的框类型在没有引用时会自动释放吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26920178/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com