我倾向于在我的C ++代码中添加很多断言,以使调试更加容易,而又不影响发行版的性能。现在,assert
是一个纯C语言宏,它没有考虑C ++机制。
另一方面std::logic_error
,C ++定义了,它是在程序逻辑中有错误(因此而得名)的情况下抛出的。抛出一个实例可能是的完美,更C ++的替代方法assert
。
问题是,assert
与abort
两者立即终止程序,而无需调用析构函数,因此跳过清理,而抛出异常手动增加了不必要的运行时成本。解决该问题的一种方法是创建一个自己的断言宏SAFE_ASSERT
,该宏的工作原理与C语言的对等宏相同,但会在失败时引发异常。
对于这个问题,我可以想到三点意见:
- 坚持C的主张。由于该程序会立即终止,因此是否正确展开更改并不重要。同样,
#define
在C ++中使用s同样不好。 - 引发异常并将其捕获到main()中。允许代码在程序的任何状态下跳过析构函数都是一种不好的做法,必须不惜一切代价避免这样做,对终止()的调用也应避免。如果引发异常,则必须将其捕获。
- 引发异常并使其终止程序。 终止程序的异常是可以的,并且由于
NDEBUG
,这在发行版本中永远不会发生。捕获是不必要的,并且可以向公开内部代码的实现细节main()
。
这个问题有明确的答案吗?有专业参考吗?
编辑:跳过析构函数当然不是不确定的行为。
static_assert
如果可用,请确保在适当的地方使用。
std::bug
吗?
std::abort()
;它只会发出一个导致进程终止的信号。
logic_error
是逻辑错误。程序逻辑中的错误称为错误。您不会通过抛出异常来解决错误。