1. 程式人生 > 其它 >【Rust】所有權和移動

【Rust】所有權和移動

環境

  • 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,賦值和傳參的時候,會轉移所有權,稱為移動。

附錄