当所有权可能在运行时移动时,Rust编译器如何知道何时调用drop?

时间:2018-10-30 03:24:48

标签: rust release ownership

根据The Rust Programming Language

  

在Rust中,您可以指定当值超出范围时运行特定的代码位,编译器将自动

插入此代码

程序员不应释放资源(从drop特性中调用Drop函数),只要所有者超出范围,Rust就会调用drop,并且这样做在编译期间,但是Rust是否可能知道何时调用drop,如果它依赖于运行时信息呢?

extern crate rand;
use rand::Rng;

struct Foo {}

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

fn main() {
    let foo = Foo {};
    if rand::thread_rng().gen() {
        let _t = foo; // move foo to _t
    } //   1) drop occurs here if random bool is true
} //       2) drop occurs here if random bool is false

在此代码中,当编译器插入代码以释放资源时,将drop的调用放在哪里,放在1)2)处?由于在编译时无法得知这一点,因此我认为应该在两个地方都调用该调用,但是只能调用一个以避免调用指针悬空。

Rust如何处理这种情况以保证内存安全?

1 个答案:

答案 0 :(得分:7)

Drop flags

  

事实证明,Rust实际上在运行时跟踪是否应该删除类型。当变量被初始化和未初始化时,该变量的下降标志被切换。当可能需要删除变量时,将评估此标志以确定是否应删除该变量。