目录

  1. 什么是 Rust 所有权
  2. 为什么要使用所有权
  3. 所有权规则
  4. 所有权与函数
  5. 引用与借用
  6. 代码示例
  7. 参考资料与出站链接

什么是 Rust 所有权

Rust 所有权 (Ownership) 是 Rust 的核心特性,用于管理内存。它通过一组编译时检查的规则,确保内存安全,无需垃圾回收器。每个值都有一个所有者,离开作用域时自动释放。


为什么要使用所有权

  • 内存安全:防止悬垂指针、双重释放等问题。
  • 性能:无需运行时垃圾回收。
  • 明确性:清晰定义变量的生命周期。
  • 并发安全:为线程安全提供基础。

所有权规则

  1. 每个值有且仅有一个所有者。
  2. 当所有者离开作用域,值被自动释放(调用 drop)。
  3. 所有权可转移,但不可复制(除非类型实现 Copy trait)。
let s1 = String::from("hello");
let s2 = s1;  // s1 转移给 s2,s1 失效
// println!("{}", s1);  // 错误:s1 已不可用

所有权与函数

  • 传递所有权:参数获取值的所有权,调用者失去访问权。
  • 返回所有权:函数可将所有权返回给调用者。
fn takes_ownership(s: String) {
    println!("{}", s);
}  // s 在此释放

fn gives_ownership() -> String {
    String::from("Rust")
}

引用与借用

  • 引用 (&):借用值而不转移所有权。
  • 规则
  • 任意时刻只能有一个可变引用(&mut)或多个不可变引用(&)。
  • 引用必须有效(无悬垂引用)。
let s = String::from("hello");
let r = &s;  // 不可变借用
println!("{}", r);

代码示例

所有权转移

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;  // 所有权转移
    println!("{}", s2);
    // println!("{}", s1);  // 错误:s1 已失效
}

运行结果:

hello

函数与所有权

fn main() {
    let s = String::from("Rust");
    takes_ownership(s);  // s 转移,之后不可用
    // println!("{}", s);  // 错误

    let s2 = gives_ownership();
    println!("{}", s2);
}

fn takes_ownership(s: String) {
    println!("Taken: {}", s);
}

fn gives_ownership() -> String {
    String::from("Rust")
}

运行结果:

Taken: Rust
Rust

引用与借用

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

    let r3 = &mut s;     // 可变借用
    r3.push_str(", world");
    println!("r3: {}", r3);
}

运行结果:

r1: hello, r2: hello
r3: hello, world

参考资料与出站链接

  1. 官方文档
  1. 学习资源
  1. 社区支持