所有权
目的
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 在这里出现,手动延长生命周期至此