Rust用户自定义类型在什么情况下会自动实现Drop trait
结论非常明确:只要用户自定义的struct、enum类型中,存在任意一个字段(对应struct)或任意一个变体的成员(对应enum)实现了Drop需要执行清理逻辑,且你没有手动为该类型实现Drop trait,编译器就会自动为这个类型生成默认的Drop清理逻辑,不受其他不需要drop的字段/变体影响。
针对Guard<T>结构体的判定
示例代码如下:
struct Guard<T> { pointer: Box<T>, locked: bool }
这个结构体会被编译器自动生成默认Drop逻辑。
它的pointer字段是Box<T>类型,Box本身自带Drop逻辑负责释放堆内存。当Guard实例离开作用域时,自动生成的drop逻辑会按照和字段定义相反的顺序,先清理locked字段(bool是Copy类型,无额外清理开销),再调用Box的drop逻辑释放pointer指向的堆空间,全程不需要用户手动编写Drop实现。
针对MaybeDroppable<T>枚举的判定
示例代码如下:
enum MaybeDroppable<T> { A(Box<T>), B }
这个枚举同样会被编译器自动生成默认Drop逻辑。
枚举的自动drop逻辑会自带分支判断:如果当前实例是A(Box<T>)变体,就执行内部Box的内存清理;如果是B变体,因为没有需要清理的成员,就直接跳过清理步骤。编译器不会因为枚举里存在不需要drop的变体,就跳过整个类型的默认Drop实现生成。
补充说明
编译器自动生成的Drop逻辑不会以手写impl Drop的形式出现在你的代码里,它是编译器在drop检查阶段自动附加到类型上的行为。只有当一个类型的所有字段、所有枚举变体的所有成员都不需要drop清理(全为Copy类型或无内存管理需求的基础类型)时,编译器才不会给它附加额外的drop清理逻辑,这类实例离开作用域时只会直接回收栈内存,无其他额外操作。
内容的提问来源于stack exchange,提问作者Waleed Dahshan

