所有权

**所有权(ownership)**是 Rust 内存安全的核心:每个值有且仅有一个所有者;所有者离开作用域时,值被 drop(析构)。这与 借用与引用生命周期 一起取代 GC 下常见的悬垂指针与数据竞争(在编译期检查)。


三条规则(口诀)

  1. 任一时刻,一个值只有一个所有者
  2. 值被移动(move)给新所有者后,旧绑定不能再使用(除非类型实现 Copy)。
  3. 所有者离开作用域时,Rust 自动调用 drop(若实现了 Drop,先运行自定义逻辑)。

移动(Move)与复制(Copy)

  • 移动:默认情况下,Copy 类型赋值或传参会把所有权转移(栈上「控制块」语义上拷贝,堆上同一块数据只认一个新所有者)。
  • Copy位级复制即完整语义;仅适用于简单标量与「全部是 Copy 的聚合」;StringVec 等堆类型不是 Copy
let s1 = String::from("hi");
let s2 = s1; // move;之后不可再用 s1

实现 Clone显式深拷贝堆数据(s1.clone()),成本可预期。


Copy vs Clone

CopyClone
含义隐式、廉价按位复制显式 .clone(),可堆分配
关系Copy: Clone(常见由 derive 同时满足约束)不要求 Copy

函数与所有权

传参相当于对实参赋值给形参:可能发生 move。需要「用完还要原值」时常传 借用与引用 &T / &mut T

返回值把所有权移出函数,常与 构造新 String / Vec转移字段 配合。


Drop trait

自定义资源释放(文件、网络句柄等)可实现 Drop::drop。注意不要手动调用 drop,用 std::mem::drop(value)离开作用域即可。


与数据类型

  • 数据类型 中的 StringVec<T> 等在堆上分配的数据由所有权唯一负责释放。
  • 栈上数组 [T; N] 在整体移动/复制策略上仍服从 Copy 与否。

相关链接