所有权
**所有权(ownership)**是 Rust 内存安全的核心:每个值有且仅有一个所有者;所有者离开作用域时,值被 drop(析构)。这与 借用与引用、生命周期 一起取代 GC 下常见的悬垂指针与数据竞争(在编译期检查)。
三条规则(口诀)
- 任一时刻,一个值只有一个所有者。
- 值被移动(move)给新所有者后,旧绑定不能再使用(除非类型实现
Copy)。 - 所有者离开作用域时,Rust 自动调用
drop(若实现了Drop,先运行自定义逻辑)。
移动(Move)与复制(Copy)
- 移动:默认情况下,非
Copy类型赋值或传参会把所有权转移(栈上「控制块」语义上拷贝,堆上同一块数据只认一个新所有者)。 Copy:位级复制即完整语义;仅适用于简单标量与「全部是Copy的聚合」;String、Vec等堆类型不是Copy。
let s1 = String::from("hi");
let s2 = s1; // move;之后不可再用 s1实现 Clone 可显式深拷贝堆数据(s1.clone()),成本可预期。
Copy vs Clone
| Copy | Clone | |
|---|---|---|
| 含义 | 隐式、廉价按位复制 | 显式 .clone(),可堆分配 |
| 关系 | Copy: Clone(常见由 derive 同时满足约束) | 不要求 Copy |
函数与所有权
传参相当于对实参赋值给形参:可能发生 move。需要「用完还要原值」时常传 借用与引用 &T / &mut T。
返回值把所有权移出函数,常与 构造新 String / Vec 或 转移字段 配合。
Drop trait
自定义资源释放(文件、网络句柄等)可实现 Drop::drop。注意不要手动调用 drop,用 std::mem::drop(value) 或离开作用域即可。
与数据类型
- 数据类型 中的
String、Vec<T>等在堆上分配的数据由所有权唯一负责释放。 - 栈上数组
[T; N]在整体移动/复制策略上仍服从Copy与否。