假设我有一个结构体
struct Foo {
a: Box<usize>,
b: Box<usize>,
}
在删除Foo示例时,我想对a和B执行一些操作
impl Drop for Foo {
fn drop(&mut self) {
println!("{}", self.a + self.b);
}
}
在这个drop
之后,盒子a和b会被删除吗?我的删除实现会覆盖默认的删除实现吗?比如这里的实际工作流是什么?
此外,如果我手动调用foo.drop()
之类的东西,这只会执行我实现的操作,而不会实际删除两个盒子,我如何确保它们被删除呢?
1条答案
按热度按时间w6lpcovy1#
在这个
drop
之后盒子a和b会被删除吗?我的删除实现会覆盖默认的删除实现吗?Rust的drop glue将确保
Foo
的字段按照声明的顺序被删除,* 在 * 自定义删除实现之后。因此,在本例中,当删除Foo
时:Foo
上调用<Foo as Drop>::drop()
。Foo
的a
被丢弃。Foo
的b
被丢弃。我们可以用下面的程序来证明这一点:
此程序的输出为:
(Playground)
此外,如果我手动调用
foo.drop()
之类的东西,这只会执行我实现的操作,而不会实际删除两个框。你不能手动调用
Drop::drop()
,这是Rust语言中的一个特例,如果你试图调用foo.drop()
,编译器会拒绝你的程序: