自動記憶體管理
傳統上,語言大致可分為兩種:
- 透過手動管理記憶體,取得完整掌控權:C、C++、Pascal...
- 程式設計師會決定何時分配或釋出堆積記憶體。
- 程式設計師必須判斷指標是否仍指向有效記憶體。
- 研究顯示,程式設計師難免會出錯。
- 透過在執行階段中自動管理記憶體,取得完整安全性:Java、Python、Go、Haskell...
- 執行階段系統會確保在可以參照記憶體之後,才釋出記憶體。
- 通常透過參照計算、垃圾收集或 RAII 的方式實作。
Rust 則融合這兩種做法:
透過正確的記憶體管理編譯時間強制執行措施,「同時」取得完整的掌控權和安全性。
Rust 運用明確所有權的概念實現這一點。
This slide should take about 10 minutes.
這張投影片的目的,在於協助其他語言的學員瞭解 Rust。
-
如果是 C 語言,必須透過
malloc
和free
手動管理堆積。常見的錯誤包括忘記呼叫free
、針對同一指標多次呼叫free
,或在其指向的記憶體釋出後取消參照指標。 -
C++ 提供智慧指標 (
unique_ptr
、shared_ptr
) 等工具,可利用有關呼叫解構函式的語言保證,確保在函式傳回時釋出記憶體。但這些工具仍很容易遭到濫用,並且會產生類似 C 語言中的那些錯誤。 -
Java、Go 和 Python 會利用垃圾收集器來識別並捨棄無法再存取的記憶體。這能確保任何指標都可以取消參照,進而消除 UAF (使用已釋放記憶體)和其他類別的錯誤。不過,GC 會耗費執行階段成本,且很難正確調整。
在許多情況下,Rust 的擁有權和借用模型效能都能媲美 C 語言,並在必要處精準分配及釋放,達成零成本作業。Rust 也提供類似 C++ 智慧指標的工具。如有需要,您還可以使用參照計數等其他選項,而且甚至還有第三方 Crate,可支援執行階段的垃圾收集作業 (本課程不會討論這部分)。