Assert语句究竟要干什么?
在assert语句中,要注意assert语句仅仅在debug版本才有效,而在release版本中无效。
如果在debug版本中assert没有捕捉到非法情况,那么表明在release版本的对应处程序也是合法的。所以不必在检查合法性。但是合法的程序并不见得就是正确的程序。使用断言的目的就是捕捉在运行时不应该发生的非法情况,不要混淆非法情况与错误情况之间的区别,后者是程序运行过程中自然存在的并且是一定要主动做出处理的。
举个常见的例子来解释,用malloc申请动态内存时,如果系统没有足够的内存可用,那么malloc返回NULL。动态内存申请失败不是非法情况,而是错误情况。
所以我们要用if语句捕捉错误情况并给出错误处理代码,而不应该使用assert。
//错误代码
Int*pBuf=(int *)malloc(sizeof(int)*1000
Assert(pBuf!=null);//错误地使用assert
....//do something
//正确代码
Int*pBuf=(int *)malloc(sizeof(int)*1000
If(pBuf==null)
{
....//错误处理代码
}else{
....//do something
}
要知道这种编程风格可能会隐藏错误。当进行防错误性设计时,如果不可能发生的事情的确发生了。则要使用断言进行报警。
要区分断言和跟踪语句的不同,后者是指一些用于报告程序执行过程中当前状态的输出语句,但它们并不一定就是bug。
程序通过了断言的检查,并不保证就万无一失了。例如memcpy()中的断言,如果给它传入两个未初始化的野指针,那么assert()就失去了作用。
浙公网安备 33010602011771号