Drop
智能指针实现了Drop
指针,用于释放资源。
Rust 几乎为所有类型都实现了Drop
特征,当变量超出作用域时,会自动调用drop(&mut self)
方法。
手动回收资源
#[derive(Debug)]
struct Foo;
impl Drop for Foo {
fn drop(&mut self) {
println!("Dropping Foo!")
}
}
fn main() {
let foo = Foo;
// 报错!
foo.drop();
println!("Running!:{:?}", foo);
}
方法foo.drop()
只是借用了目标值的可变引用,所以在方法之后再使用目标值,会引发内存安全问题。Rust 编译器拒绝这种做法,而推荐使用drop(foo)
函数。
drop(foo)
函数的签名为fn drop<T>(_x: T)
,获取了目标的所有权,更加安全。该方法不释放内存,只是抢夺所有权。实际释放资源仍然是在离开作用域时,调用std::ops::Drop::drop()
实现。
Drop 与 Copy 互斥
无法为一个类型同时实现 Copy
和 Drop
特征。实现了 Copy
的特征会被编译器隐式复制,因此非常难以预测析构函数执行的时间和频率。因此这些实现了 Copy
的类型无法拥有析构函数。