Cha*_*dan 2 memory-management runtime panic rust
在发生恐慌之前在堆或堆栈上分配的类型会发生什么?是否已调用析构函数以便取消分配类型?他们在记忆中徘徊等待被其他一些过程覆盖吗?或者它完全是另一回事?
我不知道,因为我是Rust和系统编程的新手.
默认情况下,堆栈将被展开并运行析构函数.你可以自己证明这一点:
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!");
}
Run Code Online (Sandbox Code Playgroud)
这将打印:
Dropping!
Dropping!
Run Code Online (Sandbox Code Playgroud)
请注意,这里堆栈或堆没有真正的区别.任何堆分配的项目都将有一些堆栈指向它.当堆栈上的句柄超出范围时,它会清理堆资源.
堆栈被解开,直到它从当前线程退出(如果它是主线程,则程序退出).它也可以使用catch_unwind.请小心使用此:
这是不推荐使用此功能对于一般的try/catch机制.[...]请注意,此功能可能无法捕获 Rust中的所有恐慌.
请注意,我默认说.您还可以使用选项进行编译,从而将panics直接转换为中止流程.此时,该过程结束,不再运行析构函数.
如果你在析构函数中恐慌,那么它也会游戏结束:该过程将被中止.