当恐慌发生时,为什么析构函数会运行?

时间:2017-09-18 20:10:18

标签: memory-management rust destructor exception-safety

如果一个Rust程序发生恐慌,并且假设没有恐慌捕获程序(暂时没有),那么运行析构函数并让操作系统在进程后进行清理肯定是安全的。为什么Rust会解开线程?

我能想到的唯一原因是,当没有操作系统来回收内存时,除了那个利基外,似乎没必要。

2 个答案:

答案 0 :(得分:4)

你的问题有一个错误的前提:它预先假定使用析构函数的唯一原因是清理当前进程的资源。

这确实是最常见的用法,但它不是唯一的用法。

例如,我完全可以想象TCP连接的析构函数会尝试发送关闭消息:最快的连接关闭,最快的资源在另一端释放。当然,它只是最好的努力(在中止/崩溃的情况下,析构函数永远不会运行),但它仍然是值得的。

答案 1 :(得分:1)

  

如果Rust程序发生恐慌[...],请在进程后让操作系统清理干净。

线程发生混乱时,整个进程不需要退出。在这些情况下,析构函数运行是好的。

在其他情况下,Drop实现用于执行"回滚"代码的一些关键部分。

  

假设没有恐慌的捕手(有一段时间没有恐慌)

now there are,所以我不清楚你为什么提起它。