什么是Rust的所有权系统?

Rust最独特的特性就是所有权系统(Ownership System)。与C/C++需要手动管理内存、Python/Java依赖垃圾回收不同,Rust通过所有权规则在编译期就保证了内存安全,无需垃圾回收器。

所有权三大规则

  1. Rust中每个值都有一个所有者(owner)
  2. 同一时刻,值只能有一个所有者
  3. 当所有者离开作用域,值会被自动释放

代码示例:所有权转移

fn main() {
    let s1 = String::from("hello");
    let s2 = s1; // s1 的所有权转移给 s2
    // println!("{}", s1); // 编译错误!s1 已失效
    println!("{}", s2);   // 正常工作
}

借用与引用

如果不想转移所有权,可以使用引用(reference)来"借用"值:

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

fn main() {
    let s1 = String::from("hello");
    let len = calculate_length(&s1); // 借用 s1
    println!("'{}' 的长度是 {}", s1, len); // s1 仍然有效
}

总结

概念说明
所有权每个值有且仅有一个所有者
移动赋值或传参时所有权转移,原变量失效
克隆使用 clone() 深拷贝,两个变量各自独立
借用通过 & 引用访问数据,不获取所有权