gpt4 book ai didi

memory-management - 想知道没有人引用的自动数据删除

转载 作者:行者123 更新时间:2023-12-03 11:47:00 25 4
gpt4 key购买 nike

我不认为仅在所有权范围内就可以完全解释 rust 的垃圾收集。
我已经用谷歌搜索了,这就是我所拥有的。

  • [临时数据]

  • 如果引用临时数据,则数据的生存期将根据其所在的表达式而有所不同:作用域的末尾或表达式的末尾。
    在这里寻找进一步的解释:
    https://doc.bccnsoft.com/docs/rust-1.36.0-docs-html/reference/expressions.html#temporary-lifetimes
  • [变量重新分配]
  • 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(())
    }

    关于memory-management - 想知道没有人引用的自动数据删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65453063/

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