发生运行时混乱时,堆栈/堆分配类型会发生什么?

Cha*_*dan 2 memory-management runtime panic rust

在发生恐慌之前在堆或堆栈上分配的类型会发生什么?是否已调用析构函数以便取消分配类型?他们在记忆中徘徊等待被其他一些过程覆盖吗?或者它完全是另一回事?

我不知道,因为我是Rust和系统编程的新手.

She*_*ter 6

默认情况下,堆栈将被展开并运行析构函数.你可以自己证明这一点:

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直接转换为中止流程.此时,该过程结束,不再运行析构函数.

如果你在析构函数中恐慌,那么它也会游戏结束:该过程将被中止.