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 的类型无法拥有析构函数。