是否在rust中重新分配了可变变量时调用了析构函数?

时间:2019-05-25 21:43:44

标签: rust

在rust中,假设我定义了一个可变变量,该变量可能是一些复杂的结构,其中包含具有Drop特征的向量或其他动态分配的数据。重新分配该变量时,在重新分配后是否立即调用析构函数?

let mut x = some_complex_struct;
while some_condition {
...
x = new_complex_struct
...
}

我的解释是x拥有new_complex_struct的所有权,其先前拥有的价值不再拥有,因此其析构函数将在重新分配后立即被调用。我的解释正确吗?

1 个答案:

答案 0 :(得分:3)

  

我的解释是x拥有new_complex_struct的所有权,其先前拥有的价值不再拥有,因此其析构函数将在重新分配后立即被调用。我的解释正确吗?

是的。 This can easily be checked:

struct Foo;

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

fn main() {
    let mut f = Foo;

    for i in 0..5 {
        println!("Before {}", i);
        f = Foo;
        println!("After {}", i);
    }
}

将按预期打印:

Before 0
Foo::drop
After 0
Before 1
Foo::drop
After 1
Before 2
Foo::drop
After 2
Before 3
Foo::drop
After 3
Before 4
Foo::drop
After 4
Foo::drop

Rust中的析构函数是确定性的,因此这种行为是一成不变的。