问题描述
我不认为仅用所有权范围就可以完全解释 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(())
}