网站分析的优劣势,天津建设工程信息平台,西安百度推广排名,中企动力邮箱登录入口官网喜欢的话别忘了点赞、收藏加关注哦#xff08;加关注即可阅读全文#xff09;#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵#xff01;(#xff65;ω#xff65;)
15.4.1. Drop trait的意义
类型如果实现了Drop trait#xff0c;就可以让程序员自定义当值…喜欢的话别忘了点赞、收藏加关注哦加关注即可阅读全文对接下来的教程有兴趣的可以关注专栏。谢谢喵(ω)
15.4.1. Drop trait的意义
类型如果实现了Drop trait就可以让程序员自定义当值离开作用域时发生的操作。例如文件、网络资源的释放等。
在某些语言中比如C/C对于某些类型程序员每次使用完这些类型的实例时都必须写代码来释放内存或资源。如果忘记了系统可能会过载并崩溃。在Rust中程序员可以指定每当值超出范围时运行特定的代码编译器将自动插入此代码。
任何类型都可以实现Drop trait而Drop trait只要求实现drop方法其参数是对self的可变引用。Drop trait在预导入模块(prelude)所以说使用它时不需要手动地引入。看个例子
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.);
}结构体CustomSmartPointer下有data字段为String类型。通过impl Drop for CustomSmartPointer为CustomSmartPointer实现了Drop trait。在其里面实现drop方法参数是mut self。这个方法通常是用于释放资源的但出于演示的目的这个方法里就只打印了一句话把self里的data字段的数据打印出来。在main函数里创建了两个CustomSmartPointer的实例c存的是my stuffd存的是other stuff。最后打印CustomSmartPointers created.。
输出:
CustomSmartPointers created.
Dropping CustomSmartPointer with data other stuff!
Dropping CustomSmartPointer with data my stuff!程序会先打印main函数的println!的内容也就是CustomSmartPointers created.。由于c和d走出作用域都在第19行花括号后所以程序接着会分别对c和d调用drop函数。在实现Drop trait时定义的drop函数是打印一句话所以这里c和d就会分别打印一句话。
15.4.2. 使用std::mem::drop来提前drop值
比较遗憾的是我们很难直接禁用自动的drop功能也没必要。因为Drop trait的目的就是进行自动的释放处理逻辑。
此外Rust不允许手动调用Drop trait的drop方法。但是可以调用标准库的std::mem::drop函数来提前drop值相当于提前调用了Drop trait的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),};drop(c);println!(CustomSmartPointers created.);
}在main函数中手动使用drop函数把c清理掉而d还是自动清理的这个时候的输出顺序应该是c在d前。
输出
Dropping CustomSmartPointer with data my stuff!
CustomSmartPointers created.
Dropping CustomSmartPointer with data other stuff!这里有些人可能会提出疑问c在走出作用域之前就被释放了那么在走出作用域后编译器会不会再调用一次drop方法导致二次释放(double free)的错误呢答案是不会Rust的设计很安全它的所有权系统会保证引用的有效而drop也只会在确定不再使用这个值时被调用1次。