编 程 实 战

记录编程学习之路,分享技术实践经验

Rust

Rust 所有权与生命周期:从入门到实战

2026-06-28 · 阅读 2,760 · 作者 编程实战

Rust 的所有权系统是其最核心也最具特色的设计——它在编译期保证内存安全, 不需要垃圾回收器,也不需要开发者手动管理内存。

所有权三原则

  1. 每个值都有且只有一个 所有者(Owner)
  2. 当所有者离开作用域时,值会被自动 释放(Drop)
  3. 值在任意时刻只能有一个所有者,但可以有多个 引用
fn main() {
    let s1 = String::from("hello");
    let s2 = s1;  // 所有权从 s1 转移到 s2
    // println!("{}", s1);  // 编译错误!s1 已失效
    println!("{}", s2);
}

Move 语义 vs Copy 语义

let x = 42;
let y = x;           // Copy:x 仍然有效
println!("{} {}", x, y);

let a = String::from("world");
let b = a;           // Move:a 失效
let c = b.clone();   // 显式深拷贝保留原值

借用(Borrowing)

let s = String::from("hello");
let r1 = &s;  // 不可变借用:可以有多个
let r2 = &s;

let mut t = String::from("world");
let r3 = &mut t;  // 可变借用:同一时刻只能有一个
r3.push_str("!");
核心规则:同一作用域中,要么有多个不可变引用(读),要么有且仅有一个可变引用(写),两者不能共存。

生命周期(Lifetime)

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

// 'a 表示:返回值的生命周期等于两个参数中较短的那个

结构体中的生命周期

struct Excerpt<'a> {
    content: &'a str,
}

impl<'a> Excerpt<'a> {
    fn announce(&self, msg: &str) -> &str {
        println!("{}", msg);
        self.content
    }
}

实战:内存缓存

struct Cache<'a, K, V> {
    data: HashMap<K, &'a V>,
    default: &'a V,
}

impl<'a, K, V> Cache<'a, K, V>
where K: Hash + Eq + Clone, V: Debug
{
    fn get(&mut self, key: &K) -> &&'a V {
        self.data.entry(key.clone()).or_insert(self.default)
    }
}

常见编译错误与解决

  1. "use of moved value" — 使用引用 &.clone()
  2. "cannot borrow as mutable..." — 调整代码结构,让引用在不同作用域
  3. "missing lifetime specifier" — 添加生命周期标注

总结

所有权系统是 Rust 能在编译期保证内存安全的关键。理解 Move/Copy 语义、 遵守借用规则、在必要时标注生命周期。编译器是你最好的老师。

← 返回首页