rust - 在重新分配拥有该值所有权的变量后,堆分配的值会发生什么变化?

标签 rust

<分区>

我目前正在学习 Rust 编程语言,在阅读了所有权和生命周期概念(我发现它是 GC 的优雅替代品)之后,我找不到以下问题的答案。 就所有权和生命周期而言,以下代码按照注释中的描述工作。

fn main() {
    let mut x: u32 = 10; // x is pointing to memory in stack
    println!("before reassignment: x = {}", x); // prints 10
    x = 11; // memory in stack simply has been updated with another value
    println!("after reassignment: x = {}", x); // prints 11
} // x is dropped here

大家都很高兴,但想象一下如果我们有这样的代码:

fn main() {
    let mut x = Box::new([99; 1000]); // x owns a Box, which owns heap allocated array 
    println!("before reassignment: x[0] = {}", x[0]); 
    x = Box::new([100; 1000]); // x has been assigned another Box
    // what happened to previous heap allocated array, has it been
    // dropped behind the scenes, or is that a memory leak?
    println!("after reassignment: x[0] = {}", x[0]);
} // x is dropped here, only the last assigned value gets dropped with it.

堆分配数组(第一个分配的那个)会发生什么,它会一直存在到函数结束,还是会在重新分配时被丢弃? 我还在学习 Rust,所以我对内存管理的理解可能还不完整。

这个问题与 When is the storage reclaimed for a resource that is no longer owned? 中提出的问题略有不同,因为这是关于所有者变量仍在范围内,但只是被分配了另一个值的情况。

最佳答案

每当您为实现Drop 的类型的变量分配新值时,旧值将在分配新值之前被删除。对于像 Box 这样拥有堆分配内存的类型,这意味着内存将在分配时释放。

虽然在安全的 Rust 代码中可能泄漏无法访问的内存,但偶然发生的可能性很小。

关于rust - 在重新分配拥有该值所有权的变量后,堆分配的值会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57451077/

相关文章:

rust - 将 Option 实例从 Some 设置为 None 会触发删除内部值吗?

rust - str 和 string 之间不匹配

rust - Rust 结构文字中的 ".."语法是什么?

rust - println 中链迭代器之间的不同行为!从变量

c++ - 如何从 stdin 读取多行直到 EOF?

rust - serialize::Decodable 没有为类型 `&str` 实现

arrays - 我们如何在Rust中操纵u8数组的第一位? [复制]

json - 如何有条件地将 JSON 反序列化为枚举的两个不同变体?

csv - 如何读取非UTF8编码的csv文件?

arrays - 如何获取对数组子集的有效可变引用?