所有權
目的
Mojo 引入了 Rust 的所有權檢查特性,以及所謂的值語義(value semantic),用來更好管理内存,防止諸如釋放指針後使用、二次釋放指針、内存洩漏等一系列問題。雖然對於所有權的學習需要一定時間,但一旦學會後,會在編程時有效減少心智負擔。
所有權的核心,就是任何值(一段内存空間)都具有一個主人(owner,擁有者)。比如,變量名就是一個值的擁有者,一旦變量名走完了它的生命周期 (lifetime),則被摧毀,且它的值也被摧毀。引入所有權的目的,就是通過一系列规則,保證值在其擁有者的生命周期中有效,並且一切對於值的引用和更改,都不會超過這個生命周期。
立刻銷毁機制
相對於 Rust,Mojo 對於變量的摧毀更加激進。Rust 的變量會在代碼塊結束後結束生命週期 (ASAP rule),但 Mojo 會在變量最後一次使用後立刻摧毀它。
WARNING
立刻銷毁規則帶来一個問題:例如 B
是指向結構體 A
中數據的不安全指針,但 Mojo 編譯器無法推斷出這一點。在 A
最後一次使用後便銷毁了 A
,導致了 B
是個懸垂指針,指向已經被釋放的内存。
mojo
fn main():
...
var A = SomeType()
var B = UnsafePointer(A.buffer) # A 最後一次出現,立刻銷毁
print(B) # B 指向已經釋放的内存
目前,Mojo 推薦的做法是通過使用一次 A
來強制拓展其生命週期:
mojo
# 僞代碼
fn main():
...
var A = SomeType()
var B = UnsafePointer(A.buffer) # A 不是最後一次出現,不會被銷毁
print(B) # B 指向 A 的數據,没有問題
_ = A^ # A 在這裏出現,手動延長生命週期至此