016 Rust死靈書之安全方式記憶體初始化

linghuyichong發表於2021-03-07

本系列錄製的影片主要放在B站上Rust死靈書學習影片

Rust 死靈書相關的原始碼資料在github.com/anonymousGiga/Rustonomi...

所有執行期分配的記憶體開始時都是 “未初始化”的。Rust 提供了處理未初始化記憶體的方式,既有安全的方式也有非安全的方式。

所有棧上的變數在顯式賦值之前都是未初始化的,但是Rust禁止程式設計師在賦值之前讀取這些變數。

//例子1
fn main() {
    let i: i32;
    //println!("i = {}", i); //error
    if true {
        i = 1;
        println!("i = {}", i); 
    }
    //println!("i = {}", i); //error
}
//例子2
fn main() {
    let x: i32;

    loop {
        // Rust不知道這個分支會被無條件執行
        //因為它依賴於實際值
        if true {
            // 但是它確實知道迴圈只會有一次,因為我們會無條件break
            // 所以x不需要是可變的
            x = 0;
            break;
        }
    }
    // 它也知道如果沒有執行break的話,程式碼不會執行到這裡
    // 所以在這裡x一定已經被初始化了
    println!("{}", x);

}

如果值從變數中移出且變數型別不是 Copy,那麼變數邏輯上處於未初始化狀態。

fn main() {
    //如果值從變數中移出且變數型別不是 Copy,那麼變數邏輯上處於未初始化狀態
    let x = 0;
    let y = Box::new(0);
    let z1 = x; // x仍然是合法的,因為i32是Copy
    let z2 = y; // y現在邏輯上未初始化,因為Box不是Copy

    println!("x = {}", x);
    //println!("y = {}", y);
    println!("z1 = {}", z1);
    println!("z2 = {}", z2);

    //y = Box::new(1); // 重新初始化y, error,需要將y修改成mut

    println!("Hello, world!");
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
令狐一衝

相關文章