大家都知道连续两次对同一个指针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++中是正确的.
所以并没有好的方法解决重复释放这样的问题,只能靠程序员的细心了。
评论