Rust中变量的移动move

示例程序:

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 在离开自己的作用域时会释放空间,就不会造成二次释放了。

posted @ 2022-01-24 17:55  鱼又悲  阅读(277)  评论(0编辑  收藏  举报