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