发生运行时恐慌时 stack/heap 分配的类型会发生什么情况?

What happens to stack/heap allocated types when a runtime panic occurs?

在发生恐慌之前,在堆或堆栈上分配的类型会发生什么变化?是否调用了析构函数以便释放类型?它们是否在内存中徘徊等待被其他进程覆盖?还是完全不同?

我不知道,因为我是 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!");
}

这将打印:

Dropping!
Dropping!

请注意,这里的堆栈或堆没有真正的区别。任何堆分配的项目都会在堆栈上有 something 指向它。当堆栈上的句柄超出范围时,它会清理堆资源。


堆栈会展开,直到它从当前线程退出(如果它是主线程,程序就会退出)。也可以使用 catch_unwind。不过要小心使用这个:

It is not recommended to use this function for a general try/catch mechanism. [...] Note that this function may not catch all panics in Rust.

请注意,我说的是默认 。您还可以使用一个选项进行编译,从而将恐慌直接转化为中止进程。到那时,过程结束,不再有析构函数 运行.

如果您在析构函数中出现恐慌,那么游戏也结束了:进程将中止。