yes*_*aaj 5 c++ pointers c-preprocessor
#define SAFE_DELETE(a) if( (a) != NULL ) delete (a); (a) = NULL;
Run Code Online (Sandbox Code Playgroud)
要么
template<typename T> void safe_delete(T*& a) {
delete a;
a = NULL;
}
Run Code Online (Sandbox Code Playgroud)
或任何其他更好的方式
小智 17
我不会说,因为两者都会给你一种虚假的安全感.例如,假设您有一个功能:
void Func( SomePtr * p ) {
// stuff
SafeDelete( p );
}
Run Code Online (Sandbox Code Playgroud)
将p设置为NULL,但函数外部的p副本不受影响.
但是,如果你必须这样做,那么使用模板 - 宏总是有可能在其他名称上进行打击.
删除一个;
ISO C++指定,对NULL指针的删除不做任何事情.
引用iso 14882:
5.3.5 Delete [expr.delete]
2 [...] In either alternative, if the value of the operand of delete is the
null pointer the operation has no effect. [...]
此致,Bodo
/编辑:我没注意到a = NULL; 在原帖中,所以新版本:删除一个; 一个= NULL; 但是,已经指出了设置a = NULL的问题(错误的安全感).
通常,首选内联函数而不是宏,因为宏不考虑范围,并且在预处理期间可能与某些符号冲突,从而导致非常奇怪的编译错误.
当然,有时模板和功能不会,但在这种情况并非如此.
此外,更好的安全删除不是必需的,因为您可以使用智能指针,因此不需要记住在客户端代码中使用此方法,而是封装它.
(编辑),正如其他人所指出的,安全的,删除是不是安全,因为即使有人也不会忘记使用它,它仍然可能不会收到预期的效果.所以它实际上完全没有价值,因为正确使用safe_delete需要更多的思考,而不仅仅是自己设置为0.