Rust Drop 特征与资源清理
掌握 Drop trait 在变量离开作用域时自动释放资源的机制 · 难度:入门 · +15XP
Drop 特征简介
Drop trait 允许你在值离开作用域时执行自定义清理代码。Rust 的 RAII(资源获取即初始化)模式依赖于 Drop 来管理文件句柄、网络连接、锁等资源。
基本实现
struct CustomResource {
name: String,
}
impl Drop for CustomResource {
fn drop(&mut self) {
println!("释放资源: {}", self.name);
}
}
fn main() {
let res = CustomResource { name: "数据库连接".to_string() };
println!("使用资源中...");
} // 这里自动调用 drop
Drop 的调用顺序
变量以创建顺序的逆序被 drop(后进先出):
fn main() {
let a = CustomResource { name: "A".to_string() };
let b = CustomResource { name: "B".to_string() };
// B 先 drop,然后 A
}显式调用 drop
可以使用 std::mem::drop 提前释放资源,这有助于在锁释放后避免死锁:
| 方法 | 说明 |
|---|---|
| std::mem::drop | 立即调用值的 drop 方法 |
| 作用域块 | 用 {} 限制生命周期 |
use std::mem::drop;
fn main() {
let res = CustomResource { name: "临时文件".to_string() };
drop(res); // 提前释放
println!("已释放,不能再使用 res");
}
注意事项
- Drop trait 不能实现 Copy trait(两者互斥)
- 不能手动调用
res.drop(),必须使用std::mem::drop - 结构体字段按声明顺序 drop(与变量相反)
练习提示: 实现一个 MutexGuard 模拟类型,在 drop 时打印“锁已释放”,并验证作用域结束时的自动清理。