您的位置:首页 > 编程语言 > C语言/C++

C++中使用delete 需要注意的两个问题

2010-09-15 18:06 357 查看
1.每次调用delete后一定要将对应的指针设置为NULL,要养成这样一个好习惯。为了保证每次delete后就执行赋值为NULL的习惯,可以定义单独的函数来做。下面是转载的一种方案:(http://blog.chinaunix.net/u/8681/showart_1946916.html)
偶然在BjarneStroustrup的主页上看到他对这个问题的解释:之所以C++不在delete操作符中自动这么做是因为这个操作符为了灵活并不要求一个lvalue.但是他也说C++标准本身并不限制一个具体的实现在被删除的是lvalue时把它置0,只不过现实中的编译器对这一做法并不买帐.C++explicitlyallowsanimplementationofdeletetozerooutanlvalueoperand,andIhadhopedthatimplementationswoulddothat,butthatideadoesn'tseemtohavebecomepopularwithimplementers.底下是他的方案:template<classT>inlinevoiddestroy(T*&p){deletep;p=0;}这个绿色的,无污染无公害不需冷藏也没有防腐剂的小模板应该添加到每个C++程序员的工具箱里.我记得在公司内部讨论编程风格时提到过,最好在delete一个指针之后,把它置为NULL,这样再次delete这个指针时它仍是安全的.误用被delete之后的指针也能得到最快的负面反馈(程序如果真有错误,早出错比晚出错好).但是,没有讨论出来应该怎么做,只是简单提了一下,可以用模板,但又略有疑惑对于delete[]还得有一个对应的版本.只建议一个好的做法,而不给出怎么做时,或者别人做起来很不方便时,这件事就不会被执行,至少这是一般人的行为习惯.所以,以后类似这样的空谈讨论会最后都要落实到:怎么做,再进一步,需要落实到:怎么检查漏做/做错,再进一步,怎么自动检查和自动通知漏做/做错.后两步我们在实践中对于一些容易检测的问题已经可以通过CVS服务器端的自动检查和vc中集成pc-lint实现.只不过,目前所能检查的问题只是极小的一部分.对于需要delete[]的情况,可以照样学样:template<classT>inlinevoiddestroy_array(T*&p){delete[]p;p=0;}是的,它是只节省了一句话,而且仅从名字destroy还看不出它会把p置0,但是对这种日常必需品,项目组里每个人应该一加入项目就熟悉它,而不是每次都得看它的具体定义才能使用.虽然只是1/2的代码行.还是坚持勿以善小而不为.总之,这玩艺儿我收藏了.
2.在进行delete之前必须要判断是否为空
这个可以分三种情况讨论:
(a)假设你已经做了正确的delete操作,那么指针已经是NULL,你再次delete一个NULL的指针是不会有任何问题的。
(b)如果前面没有执行正确的delete,就是说delete之后没有赋值NULL,那么你这次再判断也是徒劳,还是会做delete,导致程序异常。
(c)如果前面没有执行过delete,那么指针就非空,直接执行delete就可以正确的释放空间了。
因此无论是哪一种情况,都可以直接进行delete,该对的还是对,该错的还是错。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: