Rust中的变量有一个叫做所有权的概念。此概念的官网介绍如下:
- Rust 中的每一个值都有一个被称为其 所有者(owner)的变量。
- 值有且只有一个所有者。
- 当所有者(变量)离开作用域,这个值将被丢弃。
*以上来自网站: https://kaisery.github.io/trpl-zh-cn/ch04-01-what-is-ownership.html
在Rust中,String
,Vec<T>
等数据类型是放在heap上面的,他们都实现了drop trait
,有点类似于C++的destructor,当变量离开作用域的时候,会自动call 变量实现的drop trait
,将变量从heap中清除。因此,Rust得以在不使用GC的情况之下实现堆内存回收。
与此同时,在堆上面的变量一般都满足move semantic
,根据我的理解,此性质跟C++也非常类似。当我们把一个存放在堆上面的变量赋值给同样类型的变量的时候,Rust实际上是把值的ownership给move给了新的变量,而不是把值再copy
一遍。当变量的所有权move之后,原变量就不再享有值的所有权。比如:
let s = String::from("good");
let b = s;
println!("{}",s);
上述代码会产生compiling error,信息如下: