Rust 内存管理深度实战:从所有权到智能指针的完整剖析
Rust 语言最核心的创新在于其内存管理系统。它无需垃圾回收器(GC)即可保证内存安全,这一成就依赖于三个核心机制:所有权(Ownership)、借用(Borrowing)和生命周期(Lifetime)。本文将深入剖析这些机制的原理与实践,并探讨智能指针和并发场景下的内存管理策略。
一、所有权系统:编译期内存安全的基石
1.1 所有权三法则
Rust 的所有权系统遵循三条基本法则:
1. Rust 中的每个值都有一个变量,称为其所有者(owner)
2. 同一时刻只能有一个所有者
3. 当所有者离开作用域,值将被自动释放(drop)
1.2 移动语义与复制语义
默认情况下,赋值操作会转移所有权(move semantics),而非浅拷贝:
fn main() {
let s1 = String::from("hello");
let s2 = s1; // s1 的所有权转移给 s2
// println!("{}", s1); // 编译错误:s1 已失效
println!("{}", s2); // 正常输出
}
实现了 Copy trait 的类型在赋值时会保留原所有者。基本整数、浮点数、布尔、字符以及仅包含 Copy 类型的元组自动实现 Copy:
fn main() {
let x = 5;
let y = x; // Copy:x 仍然有效
println!("x={}, y={}", x, y); // 都可用
}
1.3 所有权与函数
函数传参同样遵循所有权规则。将值传递给函数时,所有权会移动到函数内部:
fn take_ownership(s: String) {
println!("{}", s);
} // s 离开作用域,drop 被调用
fn main() {
let s = String::from("hello");
take_ownership(s);
// s 已不再可用
}
如果希望在不转移所有权的情况下访问数据,可以使用引用(Reference):
fn borrow_value(s:

发表评论 取消回复