Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2358936
  • 博文数量: 527
  • 博客积分: 10343
  • 博客等级: 上将
  • 技术积分: 5565
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-26 23:05
文章分类

全部博文(527)

文章存档

2014年(4)

2012年(13)

2011年(19)

2010年(91)

2009年(136)

2008年(142)

2007年(80)

2006年(29)

2005年(13)

我的朋友

分类: WINDOWS

2009-05-28 18:37:22

偶然在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 inline void destroy(T*& p) { delete p; p = 0; }
这个绿色的,无污染无公害不需冷藏也没有防腐剂的小模板应该添加到每个C++程序员的工具箱里. 我记得在公司内部讨论编程风格时提到过, 最好在delete一个指针之后, 把它置为NULL, 这样再次delete这个指针时它仍是安全的. 误用被delete之后的指针也能得到最快的负面反馈(程序如果真有错误, 早出错比晚出错好). 但是, 没有讨论出来应该怎么做, 只是简单提了一下, 可以用模板, 但又略有疑惑对于 delete[] 还得有一个对应的版本.
只建议一个好的做法, 而不给出怎么做时, 或者别人做起来很不方便时, 这件事就不会被执行, 至少这是一般人的行为习惯.
所以, 以后类似这样的空谈讨论会最后都要落实到: 怎么做, 再进一步, 需要落实到: 怎么检查漏做/做错, 再进一步, 怎么自动检查和自动通知漏做/做错. 后两步我们在实践中对于一些容易检测的问题已经可以通过CVS服务器端的自动检查和vc中集成pc-lint实现. 只不过, 目前所能检查的问题只是极小的一部分.
对于需要delete[]的情况, 可以照样学样:
template inline void destroy_array(T*& p) { delete[] p; p = 0; }
是的, 它是只节省了一句话, 而且仅从名字destroy还看不出它会把p置 0, 但是对这种日常必需品, 项目组里每个人应该一加入项目就熟悉它, 而不是每次都得看它的具体定义才能使用. 虽然只是1/2 的代码行. 还是坚持勿以善小而不为.
总之, 这玩艺儿我收藏了.
阅读(1113) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~