在学习 Rust 的所有权的时候,有没有想过为什么 Rust 会设计所有权系统,为了解决什么问题?带着问题往下看
一、问题背景
在系统语言中,资源管理通常依赖程序员手动控制。以 C/C++ 为例,常见问题包括:
| 类型 | 原因 | 结果 |
|---|---|---|
| 内存泄漏 | 忘记释放 | 进程常驻内存增长 |
| 双重释放 | 重复 free/delete | 未定义行为 |
| 悬垂指针 | 使用已释放内存 | 崩溃或数据损坏 |
| 数据竞争 | 多线程共享可变数据 | 不确定性错误 |
这些问题本质上来自两个事实:
- 生命周期由程序员自行维护
- 资源释放与作用域没有强绑定关系
Rust 的设计目标是:通过静态规则,在编译期建立资源所有关系,从而消除运行时的不确定性。
所以也是为了解决以下两个问题:
- 内存问题和 UB 行为
- 数据竞争,也就是同步问题
二、所有权模型
Rust 的内存管理基于三条规则。
规则 1:每个值有唯一所有者
let s1 = String::from("hello");
let s2 = s1; // 所有权移动
// s1 不再可用
这里发生的是 move 语义,而不是拷贝。String 持有堆内存指针,因此转移所有权以避免双重释放。
规则 2:同一时间只有一个所有者
一个值在任意时刻只能由一个变量拥有。
let s = String::from("hello");
let s2 = s; // s 被移动
编译器通过类型系统保证不会出现多个独立所有者。
规则 3:所有者离开作用域时自动释放
{
let s = String::from();
}

