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



根据Rust编程语言

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

丢弃标志:

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

相关内容