Drop 特性

当我们引入析构器时,我们提到了drop函数:

  1. 回收回应类型的内存(即std::mem::size_of字节)
  2. 清理值可能正在管理的任何额外资源(例如String的堆缓冲区)

步骤2. 就是Drop特性发挥作用的地方。

#![allow(unused)] fn main() { pub trait Drop { fn drop(&mut self);} }

Drop特性是一种机制,让你为类型定义额外清理逻辑**,超出编译器自动为你做的部分。你在drop方法中放入的任何内容都会在值超出作用域时被执行。

DropCopy

谈论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