所有权与借用
所有权是 Rust 内存安全的基石。理解它,才能真正读懂编译器的"拒绝"。
所有权三规则
- Rust 中每个值都有一个所有者变量。
- 同一时刻只能有一个所有者。
- 当所有者离开作用域,值会被立即
drop。
Move 语义
对于堆上数据(如 String、Vec<T>),赋值或传参时默认是移动而非复制。原变量此后不可访问,避免了双重释放。
let s = String::from("hi");
let t = s; // s 的所有权移动到 t
// println!("{}", s); // 编译错误:value borrowed here after move
println!("{}", t);
借用:& 与 &mut
通过引用可以临时访问值而不取得所有权,称为借用。规则是:在任意时刻,要么存在一个可变借用(&mut),要么存在任意多个不可变借用(&),二者不可兼得。借用检查器(borrow checker)在编译期保证这一约束。
fn push_world(s: &mut String) {
s.push_str(" world");
}
let mut s = String::from("hello");
push_world(&mut s);
Copy 与 Clone
实现了 Copy trait 的类型(全部在栈上的标量)赋值时会自动复制,原变量仍可用。Clone 是显式深拷贝,需调用 .clone()。String 不实现 Copy,所以会移动;i32 实现了 Copy,赋值不会失效。