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

1.  每次调用delete后一定要将对应的指针设置为NULL,要养成这样一个好习惯。为了保证每次delete后就执行赋值为NULL的习惯,可以定义单独的函数来做。下面是转载的一种方案:(http://blog.chinaunix.net/u/8681/showart_1946916.html

偶然在Bjarne Stroustrup的主页上看到他对这个问题的解释:

之所以C++不在delete操作符中自动这么做是因为这个操作符为了灵活并不要求一个 lvalue.

但是他也说C++标准本身并不限制一个具体的实现在被删除的是lvalue时把它置0, 只不过现实中的编译器对这一做法并不买帐.

C++ explicitly allows an implementation of delete to zero out an lvalue operand, and I had hoped that implementations would do that, but that idea doesn't seem to have become popular with implementers.

底下是他的方案:

template<class T> inline void destroy(T*& p) { delete p; p = 0; }

这个绿色的,无污染无公害不需冷藏也没有防腐剂的小模板应该添加到每个C++程序员的工具箱里. 我记得在公司内部讨论编程风格时提到过, 最好在delete一个指针之后, 把它置为NULL, 这样再次delete这个指针时它仍是安全的. 误用被delete之后的指针也能得到最快的负面反馈(程序如果真有错误, 早出错比晚出错好). 但是, 没有讨论出来应该怎么做, 只是简单提了一下, 可以用模板, 但又略有疑惑对于 delete[] 还得有一个对应的版本.只建议一个好的做法, 而不给出怎么做时, 或者别人做起来很不方便时, 这件事就不会被执行, 至少这是一般人的行为习惯.所以, 以后类似这样的空谈讨论会最后都要落实到: 怎么做, 再进一步, 需要落实到: 怎么检查漏做/做错, 再进一步, 怎么自动检查和自动通知漏做/做错. 后两步我们在实践中对于一些容易检测的问题已经可以通过CVS服务器端的自动检查和vc中集成pc-lint实现. 只不过, 目前所能检查的问题只是极小的一部分.对于需要delete[]的情况, 可以照样学样:

template<class T> inline void destroy_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,该对的还是对,该错的还是错。
 
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值