Skip to content

所有權

目的

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 在這裏出現,手動延長生命週期至此

Mojo Miji