正文

C++为什么没有让delete后的指针自动清零?2008-04-07 16:32:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/aurora/33976.html

分享到:

大家都知道连续两次对同一个指针delete ,会造成严重的错误(一般的编译器会检测出这样的错误)。

于是很多人这样写delete:

#define SAFE_DELETE((p)  delete (p); p = 0;

这样就可以有效地避免类似的错误,因为对零指针delete是没有害处的。可是C++为什么不支持自动对delete后的指针清零呢?

原因是,delete操作符并没有要求它的操作数必须是个左值,所以p=0这样的操作未必合法。

其次,即使C++实现了这样的机制,它也可能形同虚设,比如:

class Foo;

Foo *pfoo1 = new Foo();

Foo *pfoo2 = pfoo1;

delete pfoo1;

delete pfoo2;

最后一句一样会出同样的错。

其实想实现SAFE_DELET这样的功能有个更安全可靠的办法:

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

如此以来,便可以更安全的实现指针的释放。可这样也有一个明显的缺点,

正像它只能接受左值一样,Destroy将无法接受非左值对象:

Destroy( pfoo1 );

Destroy( pfoo1+1 ); //错误(参数非左值),但delete pfoo1+1;在C++中是正确的.

所以并没有好的方法解决重复释放这样的问题,只能靠程序员的细心了。

 

阅读(4143) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册