首页 文章

当运行时期间可以移动所有权时,Rust编译器如何知道何时调用drop? [重复]

提问于
浏览
5

这个问题在这里已有答案:

根据The Rust Programming Language

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

程序员不应该显式释放资源(从 Drop trait调用 drop 函数),只要所有者超出范围,Rust就会调用 drop ,这是在 compile 时间内完成的,但Rust怎么可能知道何时调用 drop 如果它取决于 runtime 信息?

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 回答

  • 7

    Drop flags

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

相关问题