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

use*_*965 5 release ownership rust

根据Rust编程语言:

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

程序员不应该显式地释放资源(dropDrop特征中调用函数),drop每当所有者超出范围时Rust都会调用,这在编译期间完成,但是drop如果它依赖于Rust,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
Run Code Online (Sandbox Code Playgroud)

在此代码中,当编译器插入代码以释放资源时,将调用drop放置在何处,放置1)2)?由于在编译期间无法知道,我认为调用应放在两个地方,但只能调用一个以避免悬空指针.

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

DK.*_*DK. 7

丢弃标志:

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

  • @WhatsThePoint ...它称为“引用”。除非我声称自己写过,否则不是窃,我没有。当您仅链接到某个东西,而不是包括相关信息(以防链接消失)时,Stack Overflow mods不喜欢它,并且毫无用处地重新编写已经很好解释的东西。 (3认同)