自動記憶體管理

傳統上,語言大致可分為兩種:

  • 透過手動管理記憶體,取得完整掌控權:C、C++、Pascal...
    • 程式設計師會決定何時分配或釋出堆積記憶體。
    • 程式設計師必須判斷指標是否仍指向有效記憶體。
    • 研究顯示,程式設計師難免會出錯。
  • 透過在執行階段中自動管理記憶體,取得完整安全性:Java、Python、Go、Haskell...
    • 執行階段系統會確保在可以參照記憶體之後,才釋出記憶體。
    • 通常透過參照計算、垃圾收集或 RAII 的方式實作。

Rust 則融合這兩種做法:

透過正確的記憶體管理編譯時間強制執行措施,「同時」取得完整的掌控權和安全性。

Rust 運用明確所有權的概念實現這一點。

This slide should take about 10 minutes.

這張投影片的目的,在於協助其他語言的學員瞭解 Rust。

  • 如果是 C 語言,必須透過 mallocfree 手動管理堆積。常見的錯誤包括忘記呼叫 free、針對同一指標多次呼叫 free,或在其指向的記憶體釋出後取消參照指標。

  • C++ 提供智慧指標 (unique_ptrshared_ptr) 等工具,可利用有關呼叫解構函式的語言保證,確保在函式傳回時釋出記憶體。但這些工具仍很容易遭到濫用,並且會產生類似 C 語言中的那些錯誤。

  • Java、Go 和 Python 會利用垃圾收集器來識別並捨棄無法再存取的記憶體。這能確保任何指標都可以取消參照,進而消除 UAF (使用已釋放記憶體)和其他類別的錯誤。不過,GC 會耗費執行階段成本,且很難正確調整。

在許多情況下,Rust 的擁有權和借用模型效能都能媲美 C 語言,並在必要處精準分配及釋放,達成零成本作業。Rust 也提供類似 C++ 智慧指標的工具。如有需要,您還可以使用參照計數等其他選項,而且甚至還有第三方 Crate,可支援執行階段的垃圾收集作業 (本課程不會討論這部分)。