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

5
根据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个回答

9

Drop flags(降序标志):

实际上,Rust在运行时跟踪类型是否应该被释放。随着变量的初始化和去初始化,对应变量的降序标志会被切换。当一个变量可能需要被释放时,这个标志会被评估,以确定是否应该释放。


这是从您提供的链接中抄袭的。 - WhatsThePoint
4
“引用”就是指这个。只有当我声称我写了这段话时,它才属于剽窃。Stack Overflow的管理员不喜欢你仅仅提供链接,而不是包含相关信息(以防链接失效)。此外,毫无意义地重新表述已经很好解释的内容也没有任何意义。 - DK.
你本可以在回答中提供更多信息,而不是直接复制粘贴,特别是考虑到这是一个重复问题(由于你有金徽章,应该关闭它)。 - WhatsThePoint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接