最佳答案
我倾向于在我的 C + + 代码中添加大量的断言,以便在不影响发布版本性能的情况下使调试更加容易。现在,assert
是一个纯 C 宏,设计时没有考虑 C + + 机制。
另一方面,C + + 定义了 std::logic_error
,这意味着在程序逻辑出错的情况下抛出 std::logic_error
(因此得名)。抛出一个实例可能是 assert
的完美的、更像 C + + 的替代品。
问题是,assert
和 abort
都会立即终止程序,而不调用析构函数,因此会跳过清理,而手动抛出异常会增加不必要的运行时成本。解决这个问题的一种方法是创建一个自己的断言宏 SAFE_ASSERT
,它的工作方式与 C 语言相同,但在出现故障时抛出异常。
关于这个问题,我可以想出三种观点:
#define
也一样糟糕。NDEBUG
的原因,在发布版本中永远不会发生这种情况。捕获是不必要的,并将内部代码的实现细节暴露给 main()
。这个问题有明确的答案吗? 有专业的参考吗?
编辑: 跳过析构函数当然不是未定义的行为。