我一直在阅读 Rust 书,在第 15.3 章中他们介绍了 Drop 特性。它说该特征对于实现智能指针很重要(“智能指针模式的第二个重要特征是 Drop”),但从提供的示例中我看不出原因:
struct CustomSmartPointer {
data: String,
}
impl Drop for CustomSmartPointer {
fn drop(&mut self) {
println!("Dropping CustomSmartPointer with data `{}`!", self.data);
}
}
fn main() {
let c = CustomSmartPointer {
data: String::from("my stuff"),
};
let d = CustomSmartPointer {
data: String::from("other stuff"),
};
println!("CustomSmartPointers created.");
}
他们只是在容器超出范围之前打印容器拥有的值(据我所知,无论如何它都会被丢弃)。
关于这一点,他们说:“我们在这里打印一些文本以直观地演示 Rust 何时调用 drop。”
是的,但是没有提供示例来说明该特征实际上是如何有用的(我猜除了可能正在释放的日志记录资源之外)。
所以我的问题是:在这种情况下,Drop 的实现有多重要?省略它是否会导致内存泄漏或其他问题?我觉得我完全错过了重点。有人可以提供一个用例,除了在超出范围之前打印值之外还能做任何事情吗?
我尝试删除 drop 实现,但这并没有改变任何东西,除了当 CustomSmartPointer 超出范围时没有打印任何东西。没有编译器错误。
在很多情况下,您可能希望在删除值时执行某些操作。
Box::into_raw
/Box::leak
和Box::from_raw
.RefCell
或 Mutex
守卫。当守卫掉线时,需要调整一个引用计数或者释放锁。在大多数应用程序中,您很少需要手动实现
Drop
。但是,它是 RAII 习语的重要组成部分,因此您会在实现该习语的地方看到它的使用。