示例程序:
fn main() {
let s1 = String::from("yuyoubei");
let s2 = s1;
println!("s1 = {}", s1);
}
运行这段程序会报错,报错信息如下:
error[E0382]: borrow of moved value: `s1`
--> src\main.rs:4:25
|
2 | let s1 = String::from("yuyoubei");
| -- move occurs because `s1` has type `String`, which does not implement the `Copy` trait
3 | let s2 = s1;
| -- value moved here
4 | println!("s1 = {}", s1);
| ^^ value borrowed here after move
原因是由于String的存储形式,它的ptr指针指向了存储在堆内存上的字符串。而Rust不会显式地拷贝堆内存上的内容。取而代之的是使用 移动(move),将s1的内容转给了s2。
这就避免了一个 二次释放 的问题,因为将 s1 的内容移动给 s2 之后,s1 便已废弃,只有 s2 有效,所以也就只有 s2 在离开自己的作用域时会释放空间,就不会造成二次释放了。