C/C++判断指针空与不空的方法哪样合理,还是都可以,还是在都可以的情况下某个最合理

乙天 2012-09-14 10:19:15
C/C++判断指针空与不空的方法哪样合理,还是都可以,还是在都可以的情况下某个最合理?
1.
char *pT =NULL;
pT = new char[10];
if (!pT)
{
do something;
}
else
{
do others;
}

///==============================================================================
2.
char *pT = NULL;
pT = new char[10];
if (NULL == pT)
{
do somthing;
}
else
{
do others;
}
...全文
941 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
度小白 2013-03-22
  • 打赏
  • 举报
回复
虽然是去年的帖子,但是看了楼主的给分分布,实在忍不住要发言,楼主c/c++基础都没学好,而且楼主自己到最后都没懂,无语了。那些该给分的没有,那些装专业却答错的却得了高分。大部分回答者看似正确,却几乎基本没有实践经验(尤其那个回答反汇编的真会装啊),太搞笑了!
乙天 2012-09-14
  • 打赏
  • 举报
回复
结贴还是给主要问题给主要分,大家见谅,还是很感觉大家对另一问题的解释。
乙天 2012-09-14
  • 打赏
  • 举报
回复
这样总结应该可以吧:
1.用if(!pT) 和 if(NULL == pT) 在编译器看来是没有区别的;
2.if(NULL == pT)比if(!pT)较初学者易于阅读;
3.最好不要写成if(pT == NULL);
4.New分配 时候最好用异常处理机制后再去判断指针是否为空进行处理;
乙天 2012-09-14
  • 打赏
  • 举报
回复
嗯,很感谢!
yisikaipu 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]如果 内存没有分配成功不是要返回一个空指针吗,怎么会不能执行呢[/Quote]

如下仅仅是示例说明new失败的情形

如果不用异常机制,程序就挂了。你注释掉那些try/catch看看

或者如#10楼的方法屏蔽异常

void* operator new(size_t)
{
throw 3;
return NULL;
}

int main(int n,char* arg[])
{
char *p=NULL;
try
{
p=new char();
if(NULL==p);
}
catch(...)
{
;
}

return 0;
}
Corner 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
引用 6 楼 的回复:

一致的

但是两种都无法对付new失败

new失败需要异常机制对付

当然一般不会失败

当然你说你不是问这个问题

如果 内存没有分配成功不是要返回一个空指针吗,怎么会不能执行呢
[/Quote]
malloc失败返回NULL指针,new失败抛出异常
yisikaipu 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]如果if(NULL==pt) 写成 if (pT == NULL)不是容易引起手误吗[/Quote]

是的

但不是一个范畴的问题

这个手误在调试阶段就应该被发现,发现不了那是水平太次。或者高手也很罕见地犯低级失误却未及时发现,那是另话

而直观和易于检查,是指将来的维护,这个无关水平,再牛的人也没必要舍弃直观
乙天 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

一致的

但是两种都无法对付new失败

new失败需要异常机制对付

当然一般不会失败

当然你说你不是问这个问题
[/Quote]
如果 内存没有分配成功不是要返回一个空指针吗,怎么会不能执行呢

mujiok2003 2012-09-14
  • 打赏
  • 举报
回复
1.
p = new T();

若内存分配失败, 抛出std::bad_alloc异常,应该用异常处理而不是判断p的值
2. C++ 也支持不抛异常的内存分配,此时需要判断

p = new (std::nothrow)T();
if(NULL != p)
{
}


3. 内存分配失败一般就是异常,所以用抛出异常的new更合理

4. if(NULL == p)更直观,代码可读性更好。



乙天 2012-09-14
  • 打赏
  • 举报
回复
如果if(NULL==pt) 写成 if (pT == NULL)不是容易引起手误吗
yisikaipu 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]因为我习惯用“if (!pT)”因为这样可以避免if (pT == NULL)中手写错误,而我一同事习惯用if (pT == NULL) 就告诉我判断指针空与不空最好是要用if (pT == NULL)来判断!而我就感觉这两种判断方法应该是没有多大区别的,只是找不出合理的理由来解释。[/Quote]

区别是 if(NULL==pt) 的写法更直观和便于检查

if(!pt) 无非是省了几敲
乙天 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

一样。这种问题你可以把if (NULL == pT)和都写出来,然后查看反汇编就知道哪个好了。
VS2005环境查看结果:
if (NULL == pT)
cmp dword ptr [ebp-98h],0
jne wmain+0B8h (41B528h)

if (!pT)
cmp dword ptr [ebp-9……
[/Quote]

很感谢。给我提供很好的解决方法。因为我习惯用“if (!pT)”因为这样可以避免if (pT == NULL)中手写错误,而我一同事习惯用if (pT == NULL) 就告诉我判断指针空与不空最好是要用if (pT == NULL)来判断!而我就感觉这两种判断方法应该是没有多大区别的,只是找不出合理的理由来解释。
yisikaipu 2012-09-14
  • 打赏
  • 举报
回复
一致的

但是两种都无法对付new失败

new失败需要异常机制对付

当然一般不会失败

当然你说你不是问这个问题
nice_cxf 2012-09-14
  • 打赏
  • 举报
回复
1楼的回答是正确的,因为new如果出错是不会执行到那里的
至于你的问题,两个实际是一样的,用(NULL == pT)稍微清晰些便于初学者阅读
Corner 2012-09-14
  • 打赏
  • 举报
回复
一样。这种问题你可以把if (NULL == pT)和if (!pT)都写出来,然后查看反汇编就知道哪个好了。
VS2005环境查看结果:
if (NULL == pT)
cmp dword ptr [ebp-98h],0
jne wmain+0B8h (41B528h)

if (!pT)
cmp dword ptr [ebp-98h],0
jne wmain+0B8h (41B528h)
所以二者一致。
乙天 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

如果你的程序能够运行到 if 那句,那么 pT 肯定指向有效的内存,所以不用检测。
[/Quote]

你这里回答的也不对,分配完内存是要判断是否分配成功的,如果如果不检测总会有出现问题的时候!
并且你的问题答非所问啊。可能是问题没说清楚,见谅。
乙天 2012-09-14
  • 打赏
  • 举报
回复
其实我就想问if (NULL == pT) 和 if (!pT)在进行判断的时候有没有区别,或者哪个更好,跟别的代码无关,别的代码只是做衬托用的。
ri_aje 2012-09-14
  • 打赏
  • 举报
回复
如果你的程序能够运行到 if 那句,那么 pT 肯定指向有效的内存,所以不用检测。
a707000646 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

1楼的回答是正确的,因为new如果出错是不会执行到那里的
至于你的问题,两个实际是一样的,用(NULL == pT)稍微清晰些便于初学者阅读
[/Quote]
NULL == pT 和pt == NULL 以及!pT 这三种功能上毫无差别
但是NULL==pT可以防止程序员手误,如果把pT==NULL写成pT=NULL,这样编译器能通过但是不知不觉造成了错误
二NULL==pT可以在编译期帮你找出错误,因为NULL=pT是无法编译通过

65,199

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧