在Rust中,用户定义的结构体删除是否也隐式删除其字段?

dwbf0jvd  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(103)

假设我有一个结构体

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()之类的东西,这只会执行我实现的操作,而不会实际删除两个盒子,我如何确保它们被删除呢?

w6lpcovy

w6lpcovy1#

在这个drop之后盒子a和b会被删除吗?我的删除实现会覆盖默认的删除实现吗?
Rust的drop glue将确保Foo的字段按照声明的顺序被删除,* 在 * 自定义删除实现之后。因此,在本例中,当删除Foo时:

  • Foo上调用<Foo as Drop>::drop()
  • Fooa被丢弃。
  • Foob被丢弃。

我们可以用下面的程序来证明这一点:

#![allow(unused)]

struct Foo {
    a: Bar,
    b: Bar,
}

impl Foo {
    pub fn new() -> Self {
        Self {
            a: Bar("a"),
            b: Bar("b"),
        }
    }
}

impl Drop for Foo {
    fn drop(&mut self) {
        println!("Foo dropped");
    }
}

struct Bar(&'static str);

impl Drop for Bar {
    fn drop(&mut self) {
        println!("Bar named \"{}\" dropped", self.0);
    }
}

fn main() {
    Foo::new();
}

此程序的输出为:

Foo dropped
Bar named "a" dropped
Bar named "b" dropped

Playground
此外,如果我手动调用foo.drop()之类的东西,这只会执行我实现的操作,而不会实际删除两个框。
你不能手动调用Drop::drop(),这是Rust语言中的一个特例,如果你试图调用foo.drop(),编译器会拒绝你的程序:

error[E0040]: explicit use of destructor method

相关问题