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

时间:2016-10-31 14:28:34

标签: memory-management rust runtime panic

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

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

1 个答案:

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

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