【发布时间】:2014-08-12 07:19:53
【问题描述】:
如果从析构函数中抛出多个异常,您似乎不能从析构函数中抛出异常。
在 Effective C++ 中,Scott Meyers 使用向量示例,其中第一个元素在销毁期间抛出异常,然后第二个元素抛出 - 导致 C++ 出现问题(不能处理多个异常)。
这种情况(向量操作元素和元素抛出异常)肯定也可能发生在复制构造函数实现深度复制期间吗?
编辑:
我们是说它调用底层 dtor 的 dtor 的递归性质与复制构造函数不同吗?
【问题讨论】:
-
你可以从析构函数中抛出。有时它只会导致非常讨厌的行为(
abort)。你可以抛出一个拷贝构造函数是很重要的;这些通常还需要获取资源,而这可能会失败。 -
抛出异常会展开堆栈。展开堆栈在堆栈上的对象上运行 dtors。 C++ 说如果 unwind 得到一个异常,那么 C++ 运行时调用 terminate()。默认情况下,terminate() 调用 abort()。
-
您的问题是什么?是“你为什么不应该从析构函数中抛出?”还是“为什么可以从复制构造函数中抛出?”?
-
@DDrmmr 是的-为什么可以从复制委托人那里抛出?在这方面与 dtor 不同的复制构造函数是什么? (所以它有点 Q)。
-
“这种情况(向量操作元素和元素抛出异常)肯定也可能发生在复制构造函数实现深度复制期间吗?” - 试着想出一个发生这种情况的例子!
标签: c++ destructor copy-constructor