在发生恐慌之前在堆或堆栈上分配的类型会发生什么?是否已调用析构函数以便取消分配类型?他们在记忆中徘徊等待被其他一些过程覆盖吗?或者它完全是另一回事?
我不知道,因为我是Rust和系统编程的新手。
答案 0 :(得分:5)
默认情况下,堆栈将被展开并运行析构函数。你可以自己证明这一点:
struct Noisy;
impl Drop for Noisy {
fn drop(&mut self) {
println!("Dropping!");
}
}
fn main() {
let _on_stack = Noisy;
let _on_heap = Box::new(Noisy);
panic!("Oh no!");
}
这将打印:
Dropping!
Dropping!
请注意,这里堆栈或堆没有真正的区别。任何堆分配的项目都会在堆栈上指向某些指向它。当堆栈上的句柄超出范围时,它会清理堆资源。
堆栈被解开,直到它从当前线程退出(如果它是主线程,程序退出)。它也可以使用catch_unwind
。请小心使用它:
不建议将此函数用于常规try / catch机制。 [...]请注意,此功能可能无法捕获Rust中的所有恐慌。
请注意,我默认 。您还可以使用选项进行编译,从而将panics直接转换为中止流程。此时,该过程结束,不再运行析构函数。
如果你在析构函数中恐慌,那么它也会游戏结束:该过程将被中止。