Drop
特性
当我们引入析构器时,我们提到了drop
函数:
- 回收回应类型的内存(即
std::mem::size_of
字节) - 清理值可能正在管理的任何额外资源(例如
String
的堆缓冲区)
步骤2. 就是Drop
特性发挥作用的地方。
#![allow(unused)] fn main() { pub trait Drop { fn drop(&mut self);} }
Drop
特性是一种机制,让你为类型定义额外清理逻辑**,超出编译器自动为你做的部分。你在drop
方法中放入的任何内容都会在值超出作用域时被执行。
Drop
与Copy
谈论Copy
特性时,我们说类型如果管理的资源超出了它在内存中占据的std::mem::size_of
字节,就不能实现Copy
。
你可能好奇:编译器怎么知道类型是否管理资源?
没错:Drop
特性的实现!如果你的类型有显式的Drop
实现,编译器会认为你的类型附加了额外资源,并不允许你实现Copy
。
#![allow(unused)] fn main() { // 这是一个单元结构体,即无字段的结构体。 #[derive(Clone, Copy)] struct MyType; impl Drop for MyType { fn drop(&mut self) { // 我们不需要在这里做什么, // 有"空"Drop"实现就足够了 } }
编译器会报此错误信息:
error[E0184]: `Copy`特性不能为此类型实现;该类型具有析构器
--> src/lib.rs:2:7
2 | #[derive(Clone, Copy)]
| ^^^^ `Copy`不允许有析构器的类型上使用
参考资料
- 本节的练习位于
exercises/04_traits/12_drop