Rust 的所有权系统是其区别于其他编程语言的标志性特性。它使得 Rust 无需垃圾回收器就能保证内存安全,同时在编译期发现数据竞争和空指针等常见问题。本文将从一个系统程序员的视角,深入剖析 Rust 所有权模型的核心机制:所有权语义、借用检查器、生命周期参数、内部可变性模式,以及在实际工程中的常见陷阱与解决方案。
一、所有权的三条铁律
在进入复杂场景之前,先重温 Rust 所有权的三条基本规则:
- 每一个值都有且仅有一个所有者(owner)
- 当所有者离开作用域时,值被自动释放(drop)
- 所有权可以通过赋值或函数调用转移(move),也可以显式复制(copy/clone)
这三条规则看似简单,却蕴含了深远的设计智慧。我们用一段代码来感受:
fn main() {
let s1 = String::from("hello");
let s2 = s1; // 所有权转移(move)
// println!("{}", s1); // ❌ 编译错误:s1 已被移动
println!("{}", s2); // ✅ s2 现在拥有这个字符串
let s3 = s2.clone(); // 显式深拷贝
println!("s2={}, s3={}", s2, s3); // ✅ 两者都有效
}
关键在于理解,对于管理堆内存的类型(如 String、Vec

发表评论 取消回复