程序退出前的最后清理阶段指针清空是否多余?

Kratos_H 2013-02-24 02:41:36

无论是Win Application还是Win Console程序

我这里有个函数专门负责程序退出时最后清理资源的,


void func()
{
if (p != NULL)
{
delete p;
p = NULL;
}
}


那么,如果既然是程序退出时最后执行的清理函数,delete一块堆内存,是否还有将指针设置成NULL的必要,反正程序都退了.
改成如下,前提是它确实是只在程序退出时执行一次.

void func()
{
delete p; // 连if判断也不要了,反正p是不是NULL与否都不会报错
// p = NULL; 这个也不要了,程序都退了,还将它置NULL有意义否?
}



欢迎指点讨论,我这么理解对不对?
...全文
435 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
snake_xiongyang 2013-02-25
  • 打赏
  • 举报
回复
我会保留。 不差这点性能,而且如果以后重构时复用这段代码不需要再额外考虑这个问题。 因为你所有的指针处理都有范式,自我约束可以让以后的日子更好过一点。
sduxiaoxiang 2013-02-25
  • 打赏
  • 举报
回复
习惯而已 退出时不清理内存都无所谓
ForestDB 2013-02-25
  • 打赏
  • 举报
回复
习惯是平时养成的。
geekjack 2013-02-25
  • 打赏
  • 举报
回复
最好是不要去掉指向NULL的代码。 指针状态可预见
rocktyt 2013-02-25
  • 打赏
  • 举报
回复
delete不需判断NULL,delete内部也会判断,重复判断了 如果确实能保证是退出时才会调用,那的确可以不置空,但是你能保证退出时才调用这个,能保证别人也是一定在结束时才调用,而不会误解为普通的释放资源,而在其他地方调用吗?为安全起见还是置空比较好
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
虎头蛇尾是俗人的习惯, 有始有终是君子的操守。 但 不要企图优雅的结束(因为这是不可能办到的) 而要在烂的不能再烂的摊子上也能重整河山! 我咋觉得我就是那个卖矛和盾的人呢?
东北熊孩子 2013-02-25
  • 打赏
  • 举报
回复
这是您自己写的一个func函数用来对指针进行内存的释放。 您这样做当然有必要了。 但是切记要看看你的析构函数里面是怎么写的,不要进行二次delete ,这样会出现不可思议的错误哦。 温馨提示:呵呵,希望对您有所帮助。
失散糖 2013-02-25
  • 打赏
  • 举报
回复
编译器会不会自动判断出这一句清NULL是多余的,然后把之优化掉呢
majia2011 2013-02-25
  • 打赏
  • 举报
回复
多于,不过要是写dll什么的,就太不让人放心了,呵呵呵
mymtom 2013-02-25
  • 打赏
  • 举报
回复
程序都要退出了,delete真的是多余的。 除非析构函数中需要做些保存文件或者删除临时文件之类的工作,否则delete真没有什么意义。
赵4老师 2013-02-25
  • 打赏
  • 举报
回复
出来混,迟早是要还的。
AnYidan 2013-02-24
  • 打赏
  • 举报
回复
好习惯是必须的
taodm 2013-02-24
  • 打赏
  • 举报
回复
不是所有的os都是完美的进程模型。 你的代码,以后会被反复使用。 所以,如果可能,务必完美回收资源。
qq120848369 2013-02-24
  • 打赏
  • 举报
回复
多余。 不能因为想让代码显得规范而浪费性能,程序员又不是傻逼,你写上NULL别人也知道你是在做无用功。
billzheng 2013-02-24
  • 打赏
  • 举报
回复
引用 3 楼 cybio 的回复:
引用 2 楼 billzheng 的回复:At least your func() doesn't need to test p before deleting it. If p is wild pointer, you will still have undefined behavior anyway. The correct way is: C/C++ code……
虽然说delete可以处理NULL指针,但是用if先判断一下是否为空比直接调用delete操作让它内部判断效率要高吧?[疑问一] You have one extra step to compare the pointer, how can you be faster than saving that step? 我这个 p 是全局,因为它是一个单例模块的指针,整个应用在各个地方需要用到模块的函数. You don't need to delete p as it's static. Just make sure in its destructor it cleans up resources. p pointer will deleted after main, if you delete it before main, you may have double delete. 另外你给出的修改后的代码. 既然你的 p 为局部形参那么delete之后再设置为NULL是否更没意义? 因为函数结束以后 p 就在栈里消除了...对么?[疑问二] From C++ standard, delete on null pointer is perfect safe and has defined behavior. That's why you don't need to test p but just delete it and set to null.
xiaohe07 2013-02-24
  • 打赏
  • 举报
回复
养成良好的编程习惯对于以后的发展是十分有裨益的,希望你能坚持!
Kratos_H 2013-02-24
  • 打赏
  • 举报
回复
引用 2 楼 billzheng 的回复:
At least your func() doesn't need to test p before deleting it. If p is wild pointer, you will still have undefined behavior anyway. The correct way is: C/C++ code?123456template<typen……
虽然说delete可以处理NULL指针,但是用if先判断一下是否为空比直接调用delete操作让它内部判断效率要高吧?[疑问一] 我这个 p 是全局,因为它是一个单例模块的指针,整个应用在各个地方需要用到模块的函数. 另外你给出的修改后的代码. 既然你的 p 为局部形参那么delete之后再设置为NULL是否更没意义? 因为函数结束以后 p 就在栈里消除了...对么?[疑问二]
billzheng 2013-02-24
  • 打赏
  • 举报
回复
At least your func() doesn't need to test p before deleting it. If p is wild pointer, you will still have undefined behavior anyway. The correct way is:
template<typename T> 
void func(T* p)
{
    delete p;
    p = NULL;
}
Also why do you make p a global variable?
阿麦 2013-02-24
  • 打赏
  • 举报
回复
我以为:不是多余。并用,我在日常中也是这么坚持的 理由:有可能这段代码会在其他地方使用,这样可以防止“野指针”的出现。

64,648

社区成员

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

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