参见英文答案 How does Rust know whether to run the destructor during stack unwind?3个 根据 The Rust Programming Language : In Rust, you can specify that a particular bit of code be run whenever a value goes out of scope, and the
根据 The Rust Programming Language:
In Rust, you can specify that a particular bit of code be run whenever a value goes out of scope, and the compiler will insert this code automatically
程序员不应该显式释放资源(从Drop trait中调用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如何处理这种情况以保证内存安全?
Drop flags:It turns out that Rust actually tracks whether a type should be dropped or not at runtime. As a variable becomes initialized and uninitialized, a drop flag for that variable is toggled. When a variable might need to be dropped, this flag is evaluated to determine if it should be dropped.