c++ - 关于双重销毁异常对象所需的解释

标签 c++ exception exception-handling

在他富有洞察力的论文中,
<强> Error and Exception Handling ,
@Dave Abrahams 说:

Make your exception class immune to double-destruction if possible. Unfortunately, several popular compilers occasionally cause exception objects to be destroyed twice. If you can arrange for that to be harmless (e.g. by zeroing deleted pointers) your code will be more robust.

我无法理解这个特定的指南,有人可以:

  1. 请提供这种双重破坏场景的代码示例&
  2. 实现自定义异常类以避免这种情况的最佳方法是什么?

最佳答案

正如@Tony 所说,该指南旨在防止编译器错误。该指南可追溯到 2001 年左右,当时异常支持可能仍然有点不稳定。从那以后,我认为/希望大多数编译器已经修复了这个错误,所以该指南可能不再很相关。

FWIW,此指南已从 the CERT coding practices 中删除.在本页的讨论中,提出了一个有趣的观点:无论如何,将一个对象析构两次是 UB,因此无论您在类中如何处理它,都永远不会使您的程序完全可预测。

但是,如果您真的希望您的代码可以跨编译器(包括旧版本)移植,您可能应该考虑所有这些小故障。例如,Boost 做了大量工作来解决编译器错误;他们可以简单地编写符合标准的代码并将失败的责任推迟到实现上,但这会阻碍他们的库的采用。

您在编写代码时是否需要同样小心取决于您的要求,基本上可以归结为这个问题:支持数十种编译器真的值得那么多的工作量吗?

关于c++ - 关于双重销毁异常对象所需的解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11099710/

相关文章:

python - 错误 "no exception supplied"是什么意思?

java - 实现 Cloneable 并声明 CloneNotSupportedException 但仍然得到 CloneNotSupportedException

javascript - 如何在 Javascript 中重新抛出异常,但保留堆栈?

C++ 指针问题

c++ - 位设置问题

c++ - 如何改进我的哈希算法

php - 为什么PHP的 “trigger_error”返回true?

python-2.7 - 检查 Python 2.7 中是否正确引发异常?

java - 如何抛出 RuntimeException ("cannot find symbol")

c++ - DLL 依赖于 curllib.dll - 我该如何解决这个问题?