開發日誌

123

kimi @Doc

深入 Rust 所有權系統

記憶體管理是系統程式語言的核心戰場。C 把一切交給程式設計師,Java 把一切交給 GC,而 Rust 選擇了第三條路:在編譯期靜態驗證記憶體安全。這不是取捨,而是範式轉移。

Ownership is Rust's most unique feature. 所有權是 Rust 最獨特的特性。

三條基本規則

  • 每個值都有一個擁有者(owner)
  • 同一時間只能有一個擁有者
  • 擁有者離開作用域時,值即被釋放

移動語義示範


fn main() {
    let s1 = String::from("hello");
    let s2 = s1;            // s1 的所有權移動到 s2
    // println!("{}", s1);  // 編譯錯誤:s1 已失效
    println!("{}", s2);
}

借用與生命週期

借用檢查器(borrow checker)確保引用永遠有效1。規則很簡單:同一時間可以有多個不可變借用,一個可變借用,但不能同時存在2


與其他語言比較

languagestrategycost
C/C++手動管理懸空指標與洩漏風險
Java/Go垃圾回收GC 暫停與記憶體開銷
Rust所有權系統編譯期學習成本

實務工作流程

使用 rustup 安裝工具鏈,完成後按 Ctrl + ` 開啟終端機驗證版本。

cargo build
會執行完整的借用檢查,錯誤訊息包含修正建議。

遇到 E0382(value moved)時,優先考慮借用而非 clone。

各平台安裝差異

透過官方安裝程式或 winget 安裝,需另外安裝 MSVC Build Tools 作為連結器。

透過 rustup 或 Homebrew 安裝,需先安裝 Xcode Command Line Tools。

透過發行版套件管理器或 rustup 安裝,通常已內建 gcc 可直接作為連結器。

graph TD
A[宣告變數] --> B[取得所有權]
B --> C{離開作用域?}
C -->|是| D[自動呼叫 Drop]
C -->|否| E[繼續持有]

附錄:行內節點測試

科學記號:E = mc2,化學式:H2O。
換行測試:第一行
第二行。

連結推導測試:造訪Rust 原始碼,回報問題請寄回報信箱,或撥打技術支援

逃逸測試:字面輸出 @bold 不會被解析;整段跳過:這裡的 @mark[hello] 保持原樣
不成對括號跳脫測試:字面右括號 ] 與字面 @@] 序列都能輸出
不成對左括號跳脫測試:缺少開頭方括號的字面右括號 ] 測試,以及缺少結尾方括號的字面左括號 [ 測試

巢狀嵌套測試

粗體外層包含藍色標記斜體加底線的組合。

Summary
所有權不是限制,而是契約。 編譯器是隊友,不是敵人。
  1. See The Rust Book, Ch. 4.2.
  2. 這條規則在編譯期防止了資料競爭(data race),無需執行期鎖。