·tech

Rust 入门 — 所有权与借用的直觉理解

用直觉理解 Rust 的所有权、借用、生命周期三大核心概念,配以代码示例和实践建议。

Rust 入门 — 所有权与借用的直觉理解

Rust 的所有权系统是初学者最大的障碍,也是 Rust 最强大的特性。本文试图用直觉而非理论来解释它。

为什么需要所有权?

在 C 语言中,你需要手动管理内存:

c4 L
char* str = malloc(100);
// ... 使用 str ...
free(str);  // 忘记这行 → 内存泄漏
//         // 提前 free → use-after-free 漏洞

Rust 的答案是:让编译器在编译时自动追踪每一块内存的"主人"

三条核心规则

规则含义
每个值有且只有一个所有者值的主人负责释放它
同一时刻只能有一个可变引用防止数据竞争
可以有多个不可变引用允许并发读取

代码示例

rust26 L
fn main() {
    // s1 是 String 的所有者
    let s1 = String::from("hello");

    // 所有权转移给 s2 — s1 不再有效
    let s2 = s1;

    // println!("{}", s1);  // ❌ 编译错误!s1 已被移动

    // 借用:&s2 创建一个不可变引用
    let len = calculate_length(&s2);
    println!("The length of {} is {}.", s2, len);

    // 可变借用
    let mut s3 = String::from("hello");
    change(&mut s3);
    println!("{}", s3);  // "hello, world"
}

fn calculate_length(s: &String) -> usize {
    s.len()
}

fn change(s: &mut String) {
    s.push_str(", world");
}

常见误解

误解:所有权让 Rust 变得难写。 事实:所有权让你在编译时发现 bug,而不是在生产环境崩溃。

实践建议

  1. clone() 开始 — 先让代码跑起来
  2. 学会使用 引用 (&) — 避免不必要的克隆
  3. 理解 生命周期标注 — 当编译器无法推断时提供帮助
  4. 善用 String vs &str — 区分拥有和借用

下一篇将介绍 Rust 的错误处理与模式匹配。