想知道自动删除无人引用的数据

问题描述

我不认为仅用所有权范围就可以完全解释 Rust 的垃圾收集。

我已经用谷歌搜索过了,这就是我所得到的。

  1. [临时数据]

如果您引用临时数据,数据的生命周期因它出现的表达式而异:在作用域的末尾,或在表达式的末尾。

在这里寻找进一步的解释:

https://doc.bccnsoft.com/docs/rust-1.36.0-docs-html/reference/expressions.html#temporary-lifetimes

  1. [变量的重新分配]
let a = String::from("first");
a = String::from("second");

在上述情况下,第一个字符串数据在第二个赋值时自动删除

但是,从那以后我无法搜索更多信息。

在我的预测中,

结构域和数组索引可以被视为“一个独立变量”,因此将它们更改为变量的重新分配。

struct A {
    a: String,b: String
}

let mut x = A {
    a: String::from("first"),b: String::from("second")
}

x.a = String::from("reassignment"); // first string drops here

另外,我们都知道如果一个变量删除,它会删除它的所有内容。 (如下)

{
let a = vec!(String::from("first"),String::from("second"));
} // all the strings are dropped here.

好的。那么更复杂的东西呢??

Box<T>HashMap<String,i32> ... 等等... 这些数据消耗了任何其他数据的所有权。

如果我们改变它的内部数据怎么办?

它是否与重新分配结构字段相同?

我想知道它们是复杂的结构还是完全不同的对象。

我应该知道“自动删除数据”的其他规则吗?

解决方法

如果您想了解更多并观察自动删除,那么我建议为类型实现 Drop trait。 Rust 没有任何垃圾收集器,但编译器会在对象超出范围时添加指令以清除对象。 检查这个Rust RAII

如果您实现 Drop trait 并在 drop fn 中使用日志记录或打印,那么您就会知道它何时超出范围并被回收。在下面的示例中,观察对象超出范围时何时调用 Data struct 的 drop 方法。

use std::collections::HashMap;

#[derive(Debug)]
struct Data{
    val: String
}

impl Drop for Data {
    fn drop(&mut self) {
        println!("Dropping for {:?}",self.val);
    }
}

#[async_std::main]
async fn main() -> std::io::Result<()> {

    {

        let mut dataref = Data{val: "d0".to_string()};
        
        {
            let data = Data{val: "d1".to_string()};
            let data2 = Data{val: "d2".to_string()};
            dataref = data2;
            
            println!("scope marker 1");
        }
        
        println!("scope marker 2");

        let mut map = HashMap::new();
        map.insert("k1".to_string(),Data{val:"v1".to_string()});
        println!("Before chaning for k1");
        map.insert("k1".to_string(),Data{val:"v1".to_string()});
        println!("Changed k1");

    }
    Ok(())
}