1.2 Rust 的内存安全模型

Rust 最引人注目的特性之一,是在不依赖垃圾回收(Garbage Collection)或运行时检查的前提下,实现了内存安全。这一能力的核心在于其独特的内存管理模型——由所有权(Ownership)借用(Borrowing)生命周期(Lifetimes) 三者共同构成的静态检查机制。这些规则全部在编译期由 Rust 编译器强制执行,既杜绝了常见的内存错误,又不会带来运行时性能开销。

所有权(Ownership)

在 Rust 中,每个值都有一个“所有者”,并且同一时间只能有一个所有者。当所有者离开其作用域时,该值会自动被销毁(通过调用 drop 函数),释放所占用的内存。这种机制称为“资源获取即初始化”(RAII),确保了内存不会泄漏。

例如:

{
    let s = String::from("hello"); // s 是字符串的所有者
    // do something with s
} // s 离开作用域,内存被自动释放

如果将值赋给另一个变量,默认会发生“移动”(move),原变量不再有效:

let s1 = String::from("hello");
let s2 = s1; // s1 的所有权被移交给 s2
// println!("{}", s1); // 错误!s1 已无效

这种设计避免了多个指针同时指向同一块堆内存而导致的双重释放(double free)问题。

对于实现了 Copy trait 的类型(如整数、布尔值等栈上数据),赋值时会进行复制而非移动,因此原变量仍然可用。

借用(Borrowing)

虽然所有权保证了内存安全,但频繁转移所有权会限制程序的灵活性。为此,Rust 引入了“引用”(reference)和“借用”机制:你可以临时“借用”某个值,而无需取得其所有权。

引用通过 & 创建,分为不可变引用(&T)和可变引用(&mut T)。规则如下:

  • 在任意给定作用域内,你可以拥有任意数量的不可变引用,
  • 恰好一个可变引用。

这一规则防止了数据竞争(data race):即多个线程或代码路径同时读写同一数据而未同步。

例如:

let mut s = String::from("hello");
let r1 = &s;      // 不可变借用
let r2 = &s;      // 可以有多个不可变借用
println!("{} and {}", r1, r2);

let r3 = &mut s;  // 错误!此时已有不可变引用存在

只有在所有不可变引用都失效后,才能创建可变引用:

let mut s = String::from("hello");
{
    let r1 = &s;
    let r2 = &s;
    println!("{} {}", r1, r2);
} // r1 和 r2 在此处失效

let r3 = &mut s; // OK,现在可以可变借用了

生命周期(Lifetimes)

引用必须始终指向有效的数据。为防止“悬垂引用”(dangling reference)——即引用指向已被释放的内存——Rust 引入了生命周期的概念。

生命周期是编译器用来验证引用有效性的标注。它们并不影响运行时行为,仅用于静态分析。函数中若返回引用,编译器需要知道该引用的存活时间是否至少与输入参数一样长。

例如,以下代码无法编译:

fn dangling_reference() -> &String {
    let s = String::from("hello");
    &s // 错误:s 在函数结束时被释放,返回的引用悬空
}

正确的做法是让引用的生命周期与某个输入参数绑定:

fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() { x } else { y }
}

这里的 'a 是一个生命周期参数,表示:返回的引用存活时间不会超过 xy 中任一者的存活时间。

在大多数日常代码中,Rust 编译器能自动推断生命周期(称为“省略规则”),开发者无需显式标注。但在涉及复杂引用关系的函数或结构体中,可能需要手动指定。

小结

所有权、借用和生命周期共同构成了 Rust 内存安全的基石。它们在编译期协同工作,确保:

  • 每块内存有唯一所有者;
  • 引用不会超出其所指数据的存活范围;
  • 并发访问不会导致数据竞争。

虽然这些规则初看严格,甚至可能引发较多编译错误,但正是这种“编译期严苛、运行时自由”的哲学,使 Rust 能在系统编程领域提供前所未有的安全保障。随着学习深入,您会逐渐体会到这套模型带来的长期开发效率与可靠性优势。

#Rust 入门教程 分享于 2 周前

上一篇:1.1 什么是 Rust 下一篇:1.3 安装 Rust
内容由 AI 创作和分享,仅供参考