首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于指针传出值空值判断的有关问题,一个变成习惯,希望能探讨一上,没什么分了。

2013-01-28 
关于指针传出值空值判断的问题,一个变成习惯,希望能探讨一下,没什么分了。。在参数传出值中,若为指针传出值,

关于指针传出值空值判断的问题,一个变成习惯,希望能探讨一下,没什么分了。。
在参数传出值中,若为指针传出值,假如不对指针进行空值判断,仅判断方法的返回状态,则可能会导致指针的空值访问。此时应该怎么判断?是直接ASSERT就完事,还是ASSERT之后再对它进行处理? 指针 传出值 空值判断 ?ASSERT
[解决办法]
关键点不是返回后的处理,而是设计上要搞清楚为啥要返回空指针。
[解决办法]

引用:
引用:关键点不是返回后的处理,而是设计上要搞清楚为啥要返回空指针。
将地址参数传进去就是为了获得需要的数据值,然后对这个数据值的利用,重点还是在对地址参数赋值后的利用吧,至于设计上为啥要返回空指针,这就是因为无法获取到目的数据吧,难道还有别的,这个我不太清楚,请指教。。


这种情况下你应该使用异常,而不是返回值。
[解决办法]
1. 防御式
T* p = retrieve();
if(p)
{
  //...  
  p->member();
}
else
{
 //...
}
2.契约式
//约定p != 0,比如null object pattern, 或抛出异常
T* p = retrieve();
p->member();

以上两种都可以加上assert以帮助调试。
[解决办法]
要加层判断的吧
[解决办法]
给用户版本一般都是 Release版本,assert在Release不起动作!!!1
[解决办法]
引用:
说实话,我一直很纠结这种防御式的,
C/C++ code?123456T* p = retrieve();ASSERT(p);if(p != NULL){...}else{...}
我老感觉这种写法有多余的,既然判断了ASSERT(p);为什么下面还对对p是否为空进行判断。ASSERT语句在这里到底起到了一个什么作用?

ASSERT 是给你用的,if(NULL)是保证在测试不充分下用户不会遭殃的,
但最根本的是,参数传指针引用应该被严格禁止,
返回指针应该判断空,
不是不信任你的技术,而是对于多代程序员共同维护的代码,
代码封装和语意的明确有时可能远比其他要重要。
[解决办法]
不要动不动就assert,除非你是为了调试,想抓取memerydump。加个判断不是更人性化。
[解决办法]
用assert的目的不是为了判断空指针,而是为了检查一定不会为空的地方在开发过程中是否正确。
如果p = NULL也是合理的,那么就要用if语句判断并做相应的处理,如果假定p一定不会为NULL,那么可以写一个assert,如果p = NULL引起assert的了,说明你的代码什么地方有问题了,需要修改。
[解决办法]
引用:
说实话,我一直很纠结这种防御式的,
C/C++ code?123456T* p = retrieve();ASSERT(p);if(p != NULL){...}else{...}
我老感觉这种写法有多余的,既然判断了ASSERT(p);为什么下面还对对p是否为空进行判断。ASSERT语句在这里到底起到了一个什么作用?


assert只是在开发版用,帮助发现问题。
[解决办法]
引用:
assert只是在开发版用,帮助发现问题

要知道,开发版不能发现/解决所有问题。

从代码上看,assert(p);说明p== 0 属于异常情况,所以在if(p){....}else{}的else分支中应该修正/记录这种异常。 如果p== 0属于正常情况,那么不应该assert(p); 

anyway, 这取决于你的问题域。只有问题域确定了,我们才能给出较好的解。

热点排行