Z
ZHANK
所有权与借用

所有权规则

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