ToolkitX
知识库工具箱

所有权系统

所有权、借用、生命周期

30min·高级

01. 所有权系统

Rust 的所有权系统是其内存安全的核心机制,无需垃圾回收即可保证内存安全。 所有权规则: - 每个值都有一个所有者(owner) - 同一时刻只能有一个所有者 - 当所有者离开作用域时,值被自动释放 移动(Move):将值从一个变量赋给另一个变量时,所有权转移,原变量不再可用。 克隆(Clone):使用 .clone() 方法可以深拷贝数据,两个变量都拥有独立的数据。
rust
fn main() {
// 所有权转移
let s1 = String::from("hello");
let s2 = s1;  // s1 的所有权移动到 s2
// println!("{}", s1);  // 编译错误!s1 已失效
println!("{}", s2);  // 正常

// 克隆
let s3 = String::from("world");
let s4 = s3.clone();  // 深拷贝
println!("s3 = {}, s4 = {}", s3, s4);  // 两个都有效

// 函数也会转移所有权
let s5 = String::from("rust");
let s6 = takes_ownership(s5);
// s5 已失效
println!("s6 = {}", s6);
}

fn takes_ownership(s: String) -> String {
println!("获得了: {}", s);
s  // 返回所有权
}

02. 借用与引用

借用(Borrowing)允许你使用值但不获取所有权。通过引用(&)来借用。 借用规则: - 可以有任意多个不可变引用(&T) - 或者只能有一个可变引用(&mut T) - 不能同时存在可变引用和不可变引用 这些规则在编译时检查,确保数据竞争不会发生。
rust
fn main() {
let mut s = String::from("hello");

// 不可变借用
let r1 = &s;
let r2 = &s;
println!("r1 = {}, r2 = {}", r1, r2);
// r1 和 r2 在此之后不再使用

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

// 计算字符串长度,借用但不获取所有权
fn calculate_length(s: &String) -> usize {
s.len()
}

// 修改借用的值
fn add_world(s: &mut String) {
s.push_str(", world");
}
Rust 的所有权系统在编译时检查内存安全,零运行时开销。

知识测验

1/5正确 0

Rust 所有权规则是什么?

下一节

结构体与枚举

下一节