在发生恐慌之前在堆或堆栈上分配的类型会发生什么?是否已调用析构函数以便取消分配类型?他们在记忆中徘徊等待被其他一些过程覆盖吗?或者它完全是另一回事?
我不知道,因为我是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!
请注意,这里堆栈或堆没有真正的区别 . 任何堆分配的项目都会在堆栈上指向它 . 当堆栈上的句柄超出范围时,它会清理堆资源 .
堆栈被解开,直到它从当前线程退出(如果's the main thread, the program exits). It'也可以使用catch_unwind . 请注意使用它:
建议不要将此功能用于一般的try / catch机制 . [...]请注意,此功能可能无法捕获Rust中的所有恐慌 .
请注意,我默认说 . 您还可以使用选项进行编译,从而将panics直接转换为中止流程 . 此时,该过程结束,不再运行析构函数 .
如果你在析构函数中恐慌,那么它也会游戏结束:进程将被中止 .
1 回答
默认情况下,堆栈将被展开并运行析构函数 . 你可以自己证明这一点:
这将打印:
请注意,这里堆栈或堆没有真正的区别 . 任何堆分配的项目都会在堆栈上指向它 . 当堆栈上的句柄超出范围时,它会清理堆资源 .
堆栈被解开,直到它从当前线程退出(如果's the main thread, the program exits). It'也可以使用catch_unwind . 请注意使用它:
请注意,我默认说 . 您还可以使用选项进行编译,从而将panics直接转换为中止流程 . 此时,该过程结束,不再运行析构函数 .
如果你在析构函数中恐慌,那么它也会游戏结束:进程将被中止 .