目录
什么是 Rust 所有权
Rust 所有权 (Ownership) 是 Rust 的核心特性,用于管理内存。它通过一组编译时检查的规则,确保内存安全,无需垃圾回收器。每个值都有一个所有者,离开作用域时自动释放。
为什么要使用所有权
- 内存安全:防止悬垂指针、双重释放等问题。
- 性能:无需运行时垃圾回收。
- 明确性:清晰定义变量的生命周期。
- 并发安全:为线程安全提供基础。
所有权规则
- 每个值有且仅有一个所有者。
- 当所有者离开作用域,值被自动释放(调用
drop
)。 - 所有权可转移,但不可复制(除非类型实现
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
参考资料与出站链接
- 官方文档:
- 学习资源:
- 社区支持:
发表回复