判断一个指针是否为空,abort()、assert、抛出异常的使用、ASSERT与VERIFY宏的区别
来源:互联网 发布:秃鹰气步枪数据分解图 编辑:程序博客网 时间:2024/03/29 22:05
判断一个指针是否为空
//vs2005
1. abort()
#include<cstdlib>
//...
if(!ptr)
abort();
2. assert
#include<cassert>
//....
assert(ptr!=0);
//assert(xx);当xx为非零值时,无异常,当xx为零食异常中断
3. 抛出一个异常
if(!ptr)
throw "Panic: prt ==0";
4.ASSERT与VERIFY宏的区别
http://blog.vckbase.com/smileonce/articles/1184.html
http://www.epubcn.com/edoctips/contents/computer/debug_release_diff.xml
今天公司有同事问我ASSERT与VERIFY宏有什么区别,虽然平时常用这两个宏对一些变量在Debug模式下作判断,但一时还真答不上来二者之间的具体差别,看来只是知其然不知其所以然。后来查了一些资料,总算弄清楚了二者之间的区别,整理后与同事交流了一番,感觉收获还是蛮大的。下面对我的理解进行了总结:
1 ASSERT与VERIFY宏在Debug模式下作用基本一致,二者都对表达式的值进行计算,如果值为非0,则什么事也不做;如果值为0,则输出诊断信息。
2 ASSERT与VERIFY宏在Release模式下效果完全不一样。ASSERT不计算表达式的值,也不会输出诊断信息;VERIFY计算表达式的值,但不管值为0还是非0都不会输出诊断信息。
VERIFY 与ASSERT用在程序调试上并无本质上的区别。
In the debug version of MFC, the VERIFY macro evaluates its argument. If the result is 0,
the macro prints a diagnostic message and halts the program. If the condition is nonzero,
it does nothing.
In the release version of MFC, VERIFY evaluates the expression but does not print or interrupt the program. For example, if the expression is a function call, the call will be made.
断言类型 定义
ANSI C 断言 void assert(int expression );
C Runtime Lib 断言 _ASSERT( booleanExpression );
_ASSERTE( booleanExpression );
MFC 断言 ASSERT( booleanExpression );
VERIFY( booleanExpression );
ASSERT_VALID( pObject );
ASSERT_KINDOF( classname, pobject );
ATL 断言 ATLASSERT( booleanExpression );
此外,TRACE() 宏的编译也受 _DEBUG 控制。
所有这些断言都只在 Debug版中才被编译,而在 Release 版中被忽略。唯一的例外是 VERIFY() 。事实上,这些宏都是调用了 assert() 函数,只不过附加了一些与库有关的调试代码。如果你在这些宏中加入了任何程序代码,而不只是布尔表达式(例如赋值、能改变变量值的函数调用 等),那么 Release 版都不会执行这些操作,从而造成错误。初学者很容易犯这类错误,查找的方法也很简单,因为这些宏都已在上面列出,只要利用 VC++ 的 Find in Files 功能在工程所有文件中找到用这些宏的地方再一一检查即可。另外,有些高手可能还会加入 #ifdef _DEBUG 之类的条件编译,也要注意一下。
顺便值得一提的是 VERIFY() 宏,这个宏允许你将程序代码放在布尔表达式里。这个宏通常用来检查 Windows API 的返回值。有些人可能为这个原因而滥用 VERIFY() ,事实上这是危险的,因为 VERIFY() 违反了断言的思想,不能使程序代码和调试代码完全分离,最终可能会带来很多麻烦。因此,专家们建议尽量少用这个宏。
------------------------------------------------
<script type="text/javascript"><!--google_ad_client = "pub-2019358045871963";google_ad_width = 728;google_ad_height = 90;google_ad_format = "728x90_as";google_ad_type = "text_image";google_ad_channel = "";//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- 判断一个指针是否为空,abort()、assert、抛出异常的使用、ASSERT与VERIFY宏的区别
- ASSERT与VERIFY的区别
- ASSERT与VERIFY的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- ASSERT与VERIFY宏的区别
- MFC中VERIFY与ASSERT的区别
- ASSERT VERIFY TRACE的区别与应用
- MFC程序中ASSERT与VERIFY两个宏的区别
- ASSERT和VERIFY的区别
- verify和assert的区别
- verify和assert的区别
- ASSERT和VERIFY的区别
- ASSERT 与 VERIFY 区别
- 连接:)
- dir()递归 遍历子目录
- cas实现单点登录
- JAVA平台标准
- JAVA“白皮书”中的关键词汇
- 判断一个指针是否为空,abort()、assert、抛出异常的使用、ASSERT与VERIFY宏的区别
- JSP显示在线人数代码服务
- 使用BHO定制Internet Explorer浏览器
- jsp在线人数统计
- EXCEL 判断一个单元格中是否有图片
- JMail组件的使用
- 分析AJAX WebShop DataSet与DBControl数据感应机制
- 典型Web服务器
- netcat(瑞士军刀)的使用