什么时候用 assert ?


#1

assert 只有在 Debug 的时候起作用, Release 的时候不起作用.

那么什么时候该用 assert ? 什么时候又不应该使用 assert ?


#2

assert , 又叫自杀式 if .

条件不成立就要分分钟自杀, 然而 Release 的时候又消失的一干二净.

我说一个情况, assert 用来执行参数检查.

对那些乱传参数的家伙, 就用程序崩溃来惩罚他, 让他一定会去好好检查代码, 哪里写错了! 等你完全检查好了, 没有错误了, 那么为啥还继续多一个 if 浪费 CPU 的时间呢? 所以 release 就可以放心大胆的去掉检查了. 因为条件已经百分百会成立了, 还检查干嘛?


#3

我其实不赞成在基础库中使用assert,有错误要么就throw exception,要么就return state,别弄个只有debug才会出问题的情形,release被坑了都不知道是什么回事。 所以写assert真不如写 if(p == 0) throw("") 来的更实在一些。


#4

用assert就是若不能通过的条件,一定是让程序失败,因为程序员犯了错而不是用户犯了错。用exception是可以干同样的事情,但是:

  1. 项目是C而不是C++怎么办?
  2. 项目为了兼容性不使用exception的C++代码怎么办?
  3. 程序员一错再错,把exception捕获了又吞了怎么办?

基础库里的assert的就是要逼着程序员用基础库是别犯错啊。release被坑了应该问为啥debug build上没发现问题。


#5

恩。

PS:

  1. 不需考虑 C. C 已经死了
  2. 禁用 exception 是愚蠢的。
  3. 吞掉异常是可行的,程序并没有带病运行。只要保证代码是异常安全的,异常处理机制保证状态是一致的, 没有带病运行。

#6

这个真是case by case。比如产品早期库是C接口放出去的,得一直支持啊,得一直保证升级后接口没变,用户拿到了新lib直接link,拿到了dll直接用就可以了。至于为什么会在项目里禁用C++ exception理由很多,早期C++ exception有额外的性能消耗,而产品又是Windows only,所有函数调用都有标准HRESULT返回错误,禁掉当然是个合理的选择。


#7

release里面也不是完全不能用,如果有看门狗机制,用assert能让程序尽快重启。当然最好还是在debug的时候才带assert,但是debug又是另外一回事请,比如windows下的debug做的事情太多,导致一些错误反而被规避了。