所有权

什么是所有权 ownership? 这个概念在之前的 C/C++ 以及 Python 等编程语言中, 并没有被太多的强调,

在 Rust 中, 所有权相关的有三个部分:

  • 变量的值指的是它所占用的内存区域, 有一个对应的变量名指代该内存区域, 该变量是该内存区域的所有者
  • 每个值有且只有一个属主/所有者, 一个资源只能一个所有者
  • 当所有者超出作用域时, 这个值被释放 (drop)

所有权的问题会出现在哪里

在函数间传递对象

在函数调用时, 传递参数的方法有:

  • 值传递
    • 复制旧的对象
    • 转移旧的对象
  • 指针/引用, 传递一个内存地址

在结构体中保存对象

  • 存储值的引用或指针
    • 引用的有效性
    • 值本身已经被释放了, 但是还保留有引用指向它
  • 存储值本身
    • 多个对象如何共享同一个值

缓解所有权的限制

上面提到了所有权的概念, 可以发现它的规则很严格, 如果只使用这样的方式来编程, 将极为受限, 为此, Rust 引入了另外的规则来缓限这样的限制, 给编写代码提供便利:

  • 可以将值从一个变量移到另一个变量上, 用于重新安排
  • 对于基本的值, 比如整数, 布尔值, char 等, 可以直接完整地拷贝它的值, 因为这样的值结构简单高效, Copy trait
  • 可以完整地拷贝一个值, 包括它内部管理的堆内存等, 这是深拷贝, Clone trait
  • 标准库提供了引用计数容器, Rc及 Arc, 这样多个变量可以拥有一个值; 当最后一个变量被释放后, 它们拥有的值也会被释放
  • 可以使用 borrow reference (借用), 引用并不会改变值的拥有者

我们接下来依次介绍以上几个方面的内容.