【Rust】所有權和移動
阿新 • • 發佈:2021-12-17
環境
- Rust 1.56.1
- VSCode 1.61.2
概念
參考:https://doc.rust-lang.org/stable/rust-by-example/scope/move.html
示例
因為變數要負責釋放他們的資源,所有一個資源只能有一個所有者,避免重複釋放,其中引用不擁有資源。在進行賦值的時候,所有權會發生轉移,這稱為移動(move),發生移動後,之前的變數不能再使用了,這可以避免懸垂指標(dangling pointers)。
main.rs
// 獲取所有權 fn destroy_box(c: Box<i32>) { println!("Destroying a box that contains {}", c); // c 在這裡被銷燬 } fn main() { // 棧上分配 let x = 5u32; // 沒有發生移動,是拷貝(copy) let y = x; // 兩個變數同時可用 println!("x is {}, and y is {}", x, y); // 堆上分配 let a = Box::new(5i32); println!("a contains: {}", a); // 發生了移動 let b = a; // 編譯錯誤,a 已經發生了移動 // println!("a contains: {}", a); // 將所有權傳遞到了函式中,也發生了移動 destroy_box(b); // 編譯錯誤,發生了移動,已經不能再使用了 // println!("b contains: {}", b); }
總結
瞭解了 Rust 中的變數的所有權和移動,如果沒有實現 Copy,賦值和傳參的時候,會轉移所有權,稱為移動。