我不会说,因为两者都会给你一种虚假的安全感.例如,假设您有一个功能:
void Func( SomePtr * p ) { // stuff SafeDelete( p ); }
将p设置为NULL,但函数外部的p副本不受影响.
但是,如果你必须这样做,那么使用模板 - 宏总是有可能在其他名称上进行打击.
我不会说,因为两者都会给你一种虚假的安全感.例如,假设您有一个功能:
void Func( SomePtr * p ) { // stuff SafeDelete( p ); }
将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.