为什么 delete 不会将操作数置 0?


  
考虑一下: 
  
    delete p; 
    // ... 
    delete p; 
  
如果在...部分没有涉及到 p 的话,那么第二个“delete p;”将是一个严重的错误,因
为 C++的实现(译注:原文为 a C++ implementation,当指 VC++这样的实现了 C++
标准的具体工具)不能有效地防止这一点(除非通过非正式的预防手段)。既然delete 0
从定义上来说是无害的,那么一个简单的解决方案就是,不管在什么地方执行了“delete 
p;”,随后都执行“p=0;”。但是,C++并不能保证这一点。 
  
一个原因是,delete 的操作数并不需要一个左值(lvalue)。考虑一下: 
  
    delete p+1; 
    delete f(x); 
  
在这里,被执行的 delete 并没有拥有一个可以被赋予 0 的指针。这些例子可能很少见,
但它们的确指出了,为什么保证“任何指向被删除对象的指针都为 0”是不可能的。绕过这
条“规则”的一个简单的方法是,有两个指针指向同一个对象: 
  
    T* p = new T; 
    T* q = p; 
    delete p; 
    delete q;   // 糟糕! 
  
C++显式地允许delete操作将操作数左值置 0,而且我曾经希望C++的实现能够做到这一
点,但这种思想看来并没有在C++的实现中变得流行。 
  
如果你认为指针置0 很重要,考虑使用一个销毁的函数: 
  
    template<class T> inline void destroy(T*& p) { delete p; p = 0; } 
  
考虑一下,这也是为什么需要依靠标准库的容器、句柄等等,来将对 new 和 delete 的显
式调用降到最低限度的另一个原因。 
  
注意,通过引用来传递指针(以允许指针被置 0)有一个额外的好处,能防止 destroy()
在右值上(rvalue)被调用: 
  
    int* f(); 
    int* p; 
    // ... 
    destroy(f());   // 错误:应该使用一个非常量(non-const)的引用传递右值 
    destroy(p+1);   // 错误:应该使用一个非常量(non-const)的引用传递右值 

posted on 2007-03-24 09:45 阿刚 阅读(207) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2007年3月>
25262728123
45678910
11121314151617
18192021222324
25262728293031
1234567

统计

常用链接

留言簿(1)

随笔档案

文章档案

C++ BBS

C++ FAQ

C++ WEBSITE

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜