C++程序里凡是用到指针就去检查是否为空是否绝对有必要???

weichen2005 2009-06-18 04:18:01
很多人的说法是只要用到指针就要去检查其是否为空, 美其名曰: 健壮
比如写一个函数:

void f(int* p)
{
if (!p)
return xxx;
... ...
}

但目前很多项目的情况是:分了很多模块,并且模块的层次很深,并且一个人要
负责多个模块,这种情况下每个库函数都去检查空指针似乎有点“自打耳光”的
感觉

有人会说到维护方面的好处:即如果以后有人接手其它模块,不容易出问题;但从
维护的角度来看,合格的维护者应该首先遵循原作者的风格(假设原作者只在一个
地方检查了指针的合法性,其它地方忽略检查),那么他也不会随便打破这种风格
他如果添加其它代码,也按这种风格走的话,也不会出问题

C库里的函数就不检查空指针,是因为它假设你上层传给它的就是一个合法的指针
...全文
1025 114 打赏 收藏 转发到动态 举报
写回复
用AI写文章
114 条回复
切换为时间正序
请发表友善的回复…
发表回复
The_Only_Name_2 2011-06-08
  • 打赏
  • 举报
回复
我觉得作这样的检查是很有必要的,你说编程风格,这个东西没有确定的标准,你怎么知道接手你代码的人能领会你的风格呢?你有怎么保证领会你风格的人也愿意按照你的风格来做呢?风格是很个性的东西,现代软件开发要的是标准化和规范化,你把一个大型项目的安全性依赖于风格不是太危险了么?

而且被调用代码本身是处于库的位置,你是给别人用的,就要有封装性,你不能卖个热水瓶给客户,然后告诉客户,这个瓶子你回家要在外面加层保温膜,我这个只能盛水。或者说你卖个桌子给客户,然后告诉客户说我这个桌子边是毛糙的有刺,桌角也很尖锐,你用的时候要小心不要被刺扎到或者被桌角顶到,你说客户什么感觉?

既然是提供服务和产品,为什么不把应该考虑到的都考虑到,能想到的危险尽量排除呢?

你说这样的安全检查影响开发效率,可是开发中最废时间的不是把逻辑思路变成代码,这个很快,逻辑出来了代码就有了,最费时间的是跑的时候遇到问题但是不知道问题出在哪里,而且又不是每次都重现,调试的人都要吐血,像这样的问题大多是程序图省事很多安全性工作没有做到位造成的,结果造成时间更多的浪费。
ustc176048875 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 112 楼 ustc176048875 的回复:]
发表一下我的观点:
C中只有值传递,即使参数是指针,同样采用的是值传递。所以,无需证明这个指针是否为空,因为实际传入的是指针指向的值。
C++中,则传入的是指针。所以,有必要判定这个指针是否为空。
[/Quote]
我胡说八道了。。。哈哈。。我错了
ustc176048875 2010-01-12
  • 打赏
  • 举报
回复
发表一下我的观点:
C中只有值传递,即使参数是指针,同样采用的是值传递。所以,无需证明这个指针是否为空,因为实际传入的是指针指向的值。
C++中,则传入的是指针。所以,有必要判定这个指针是否为空。
ypb362148418 2010-01-12
  • 打赏
  • 举报
回复
个人觉得有必要,这样能减少出错的可能
taodm 2010-01-12
  • 打赏
  • 举报
回复
看《代码大全(第二版)》第八章防御式编程(P187)、《编程精粹》安静地处理(p20)、《C++实践之路》6.2与“防错性编程”作斗争
qhy00 2010-01-12
  • 打赏
  • 举报
回复
我觉得这个属于指针的管理问题,双方应有一个约定,规定是使用方(在外部)负责判定为空,还是在内部判断?
lovesi3344 2009-11-17
  • 打赏
  • 举报
回复
如果要delete一个指针就不用检查指针是否为空指针。
delete过的指针就不能再使用了,必须重新分配内存才能使用。
forster 2009-11-12
  • 打赏
  • 举报
回复
自己传的assert
别人写的if
如果整个工程都用she catch吧
iisbsd 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 103 楼 weichen2005 的回复:]
“稳定性的要求是超过性能的”的说法有点模棱两可,难道越大的系统性能就应该越低?
[/Quote]

大的系统的性能优化不会花在这一两条机器指令上面,网络延时的一点点波动就把这点优化掩盖掉了。
lovesi3344 2009-11-11
  • 打赏
  • 举报
回复
指针要考虑空指针
循环要考虑死循环
经验之谈
menghuilanqiao 2009-11-09
  • 打赏
  • 举报
回复
mark
weichen2005 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 101 楼 youhun_1 的回复:]
个人感觉,对于一个软件来讲,当软件系统越来越庞大,并且经手人常常变更的时候,空指针
的检查是很必要的,因为经手人的不同,思路也不同,水平也不同,而且对于一个大的软件系统
来说,每个人也只能看到一小块,在这种状态下,稳定性的要求是超过性能的,所以应该进行检查。
[/Quote]

正因为系统越来越大,所以架构和设计的一致性,概念完整性才更加重要
而不应该盲目地追求“只管自己这一块”

“稳定性的要求是超过性能的”的说法有点模棱两可,难道越大的系统性能就应该越低?
scorpio_tiger 2009-11-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 pysjp 的回复:]
楼主在Debug版本中建议使用ASSERT宏,这在微软编程精粹中是专门提到的,但是代码必须要经过充分性测试,一旦发布成release版本,ASSERT就不起作用了
[/Quote]
正解! 我认为对函数的调用没必要每次都检查返回值,例如对系统函数的调用,每个调用都有一些标识,标识此函数调用是否成功。如果每次都检查没必要。另外每次检查是否都对其进行了处理?如果一个程序的模块调用层次比较深,上层未必对此函数的返回结果进行了处理。
lovesi3344 2009-11-02
  • 打赏
  • 举报
回复
mark
zpf82118 2009-11-02
  • 打赏
  • 举报
回复
有必要
TADICAN 2009-11-02
  • 打赏
  • 举报
回复
凡事无绝对
weichen2005 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 92 楼 wangyang327329 的回复:]
你这样做的确是彻底贯彻了防御性编程的思想,感觉过于保守了。对于传递给函数的指针
参数,一般可能会用ASSERT断言,不会用if来判断。关键是你要想清楚就是指针为空是否
允许出现在上下文中,如果不允许,就是用断言,如果允许就使用if判段
[/Quote]

丁丁同志说得有道理

不过,我想还是具体问题具体分析,"指针为空是否允许出现在上下文中"
这两种情况能多举几个例就好了
youhun_1 2009-11-02
  • 打赏
  • 举报
回复
个人感觉,对于一个软件来讲,当软件系统越来越庞大,并且经手人常常变更的时候,空指针的检查是很必要的,因为经手人的不同,思路也不同,水平也不同,而且对于一个大的软件系统来说,每个人也只能看到一小块,在这种状态下,稳定性的要求是超过性能的,所以应该进行检查。
zhengjiankang 2009-11-02
  • 打赏
  • 举报
回复
很有必要
iisbsd 2009-11-02
  • 打赏
  • 举报
回复
应该用assert的,如果调用者不应该使用空指针调用(文档中说明了),那assert一下对他们也是很好的提醒,而且在发布版中,没有性能影响,即使是有影响,一个条件跳转的机器指令,耽误的时间有限。

维护别人的代码并不是说不能改正错误,如果NULL本来不是期望的参数,又没有使用assert,那是当初写得不好,应该改掉的。
加载更多回复(94)

64,635

社区成员

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

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