所有权规则
Move 语义、所有权转移、Clone/Copy trait、栈与堆
所有权规则
所有权是 Rust 最独特的设计。 三条规则:①每个值有唯一所有者 ②同一时刻只能有一个所有者 ③所有者离开作用域值被丢弃。
学完本章你将: 掌握 Move 语义、Clone/Copy、栈与堆。
三条所有权规则
rust
fn main() {
// 规则 1 & 3:s 进入作用域,拥有字符串
let s = String::from("hello");
// ... 使用 s ...
} // s 离开作用域,drop 被调用——内存自动释放!
// 不需要 free!不需要 GC!
Move 语义
rust
let s1 = String::from("hello");
let s2 = s1; // s1 的所有权移动到 s2
// println!("{}", s1); // ❌ s1 已经无效!
println!("{}", s2); // ✅
// String 的数据在堆上——Move 只复制栈上的指针/长度/容量
// 堆数据不动——高效!
Clone —— 深拷贝
rust
let s1 = String::from("hello");
let s2 = s1.clone(); // 深拷贝——堆数据也复制
println!("{}", s1); // ✅ s1 仍然有效
println!("{}", s2); // ✅
Copy Trait —— 自动复制
rust
// 栈上数据自动实现 Copy——赋值时复制而不是移动
let x = 5;
let y = x; // x 被复制——不是移动
println!("{}", x); // ✅ x 仍然有效
// 实现 Copy 的类型:所有整数、浮点、bool、char、tuple(如果元素都是 Copy)
// 不实现 Copy:String、Vec、Box 等堆分配类型
函数传参与所有权
rust
fn take_ownership(s: String) {
println!("{}", s);
} // s 被 drop
fn make_copy(x: i32) {
println!("{}", x);
}
let s = String::from("hello");
take_ownership(s);
// println!("{}", s); // ❌ s 已移动
let x = 5;
make_copy(x);
println!("{}", x); // ✅ i32 是 Copy