首页 > 解决方案 > 当所有权可能在运行时移动时,Rust 编译器如何知道何时调用 drop?

问题描述

根据Rust 编程语言

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

程序员不应该显式释放资源(dropDroptrait 调用函数),drop只要所有者超出范围,Rust 就会调用,这是在编译drop时完成的,但是如果依赖,Rust 怎么可能知道何时调用关于运行时信息?

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 如何处理这种情况以保证内存安全?

标签: rustreleaseownership

解决方案


丢弃标志

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


推荐阅读