为释放责任建立规则

资源被取得以后,程序需要确定谁负责在不再使用时处理它。所有权规则把这种责任与程序中的值或管理对象关联,避免只留下可以访问资源的地址,却没有一致的释放约定。

Rust入门规则规定每个值有一个所有者,所有者离开其适用的作用域时值会被丢弃。以拥有堆上缓冲区的String为例,清理逻辑由其所有权与Drop行为共同承担,而不是要求使用者在每条返回路径手写释放。

参考:[1] [2]

移动、复制与借用分别处理

把Rust的String绑定给另一个变量,通常会移动所有权,使旧绑定不能再按原方式使用。它不意味着自动深拷贝整个缓冲区;显式clone可以取得独立副本,具体复制成本仍依类型实现而定。

借用则允许暂时通过引用访问值,而不把最终清理责任交给借用者。共享引用与独占可变引用受到不同约束,因而“可以访问”“可以修改”和“负责释放”并不是同一种权限。

参考:[1] [3]

共享也需要管理对象

所有权并不等于禁止共享。Rust的Rc<T>让多个持有者共同拥有同一分配,通过引用计数追踪强所有者,并在计数归零时清理其值;这些持有者管理的是共享分配,而不是各自复制一份内容。

Rc面向单线程使用,它也不会单独赋予共享值任意可变访问。RefCell等内部可变性机制把部分借用检查放到运行时。因此,共享所有权、线程安全和允许哪些修改,仍须分别说明。

参考:[4] [5]