Deref 与 Drop
Deref 自动解引用、DerefMut 可变、Drop 析构 RAII、手动 drop
Deref 与 Drop
Deref 让智能指针像普通引用一样使用(自动解引用),Drop 是 Rust 的 RAII——离开作用域自动清理。
学完本章你将: 掌握 Deref 自动解引用、Drop 析构、手动 drop。
Deref —— 自动解引用
rust
struct MyBox<T>(T);
impl<T> MyBox<T> {
fn new(x: T) -> MyBox<T> { MyBox(x) }
}
use std::ops::Deref;
impl<T> Deref for MyBox<T> {
type Target = T;
fn deref(&self) -> &T {
&self.0
}
}
fn main() {
let x = 5;
let y = MyBox::new(x);
// 不需要写 *y——Deref 自动调用
assert_eq!(5, *y); // *y = *(y.deref())
// 隐式解引用转换
fn hello(name: &str) { println!("Hello, {}!", name); }
let m = MyBox::new(String::from("Rust"));
hello(&m); // &MyBox<String> → &String → &str(自动链式解引用)
}
Drop —— RAII 析构
rust
struct CustomSmartPointer {
data: String,
}
impl Drop for CustomSmartPointer {
fn drop(&mut self) {
println!("释放: {}", self.data);
}
}
fn main() {
let c = CustomSmartPointer {
data: String::from("资源1"),
};
{
let d = CustomSmartPointer {
data: String::from("资源2"),
};
println!("内部作用域");
} // d 在这里被 drop
println!("外部作用域");
} // c 在这里被 drop
// 输出顺序:
// 内部作用域
// 释放: 资源2
// 外部作用域
// 释放: 资源1
手动提前释放
rust
let c = CustomSmartPointer { data: String::from("手动释放") };
// c.drop(); // ❌ 不能显式调用 drop
drop(c); // ✅ 用 std::mem::drop 提前释放