读书人

程序退出前的最后清算阶段指针清空是否

发布时间: 2013-03-01 18:33:02 作者: rapoo

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

无论是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有意义否?
}



欢迎指点讨论,我这么理解对不对?

[解决办法]
我以为:不是多余。并用,我在日常中也是这么坚持的

理由:有可能这段代码会在其他地方使用,这样可以防止“野指针”的出现。
[解决办法]
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?


[解决办法]
养成良好的编程习惯对于以后的发展是十分有裨益的,希望你能坚持!
[解决办法]
引用:
引用: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.
[解决办法]
不是所有的os都是完美的进程模型。
你的代码,以后会被反复使用。
所以,如果可能,务必完美回收资源。
[解决办法]
好习惯是必须的
------解决方案--------------------


虎头蛇尾是俗人的习惯,
有始有终是君子的操守。



不要企图优雅的结束(因为这是不可能办到的)
而要在烂的不能再烂的摊子上也能重整河山!

我咋觉得我就是那个卖矛和盾的人呢?
程序退出前的最后清算阶段指针清空是否多余
[解决办法]
delete不需判断NULL,delete内部也会判断,重复判断了

如果确实能保证是退出时才会调用,那的确可以不置空,但是你能保证退出时才调用这个,能保证别人也是一定在结束时才调用,而不会误解为普通的释放资源,而在其他地方调用吗?为安全起见还是置空比较好
[解决办法]
最好是不要去掉指向NULL的代码。 指针状态可预见
[解决办法]
习惯是平时养成的。

[解决办法]
我会保留。
不差这点性能,而且如果以后重构时复用这段代码不需要再额外考虑这个问题。
因为你所有的指针处理都有范式,自我约束可以让以后的日子更好过一点。
[解决办法]
出来混,迟早是要还的。
[解决办法]
多于,不过要是写dll什么的,就太不让人放心了,呵呵呵
[解决办法]
这是您自己写的一个func函数用来对指针进行内存的释放。
您这样做当然有必要了。
但是切记要看看你的析构函数里面是怎么写的,不要进行二次delete ,这样会出现不可思议的错误哦。

温馨提示:呵呵,希望对您有所帮助。

读书人网 >C++

热点推荐