Drop 特质 (The Drop trait)

我们引入析构函数 (destructor)时提到过,drop 函数会:

  1. 回收类型所占用的内存(即 std::mem::size_of 那么多字节)
  2. 清理该值可能管理的任何额外资源(例如 String 的堆缓冲区)

第 2 步正是 Drop 特质登场的地方。

pub trait Drop {
    fn drop(&mut self);
}

Drop 特质给你一种机制,让你为自己的类型定义 额外的 清理逻辑——超出编译器自动替你做的那部分。
你放进 drop 方法里的代码会在值离开作用域时被执行。

DropCopy (Drop and Copy)

谈到 Copy 特质时我们说过:如果一个类型管理了超出 std::mem::size_of 字节的额外资源,它就不能实现 Copy

你可能会问:编译器怎么知道一个类型是否管理了额外资源?
对:通过 Drop 特质的实现!
如果你的类型有显式的 Drop 实现,编译器就会假定该类型附带了额外资源,从而不允许你实现 Copy

// 这是一个单元结构体 (unit struct),即没有字段的结构体。
#[derive(Clone, Copy)]
struct MyType;

impl Drop for MyType {
    fn drop(&mut self) {
       // 这里我们不需要做什么,
       // 有一个"空"的 Drop 实现就足够了
    }
}

编译器会用这条错误信息提出抗议:

error[E0184]: the trait `Copy` cannot be implemented for this type; 
              the type has a destructor
 --> src/lib.rs:2:17
  |
2 | #[derive(Clone, Copy)]
  |                 ^^^^ `Copy` not allowed on types with destructors

原文链接:英文原文