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()就失去了作用。

源地址:http://www.lirenedu.org/index.php?ack=xinwen&id=1221

posted on 2012-09-12 14:48  yetta2011  阅读(186)  评论(0)    收藏  举报

导航