哪个版本的safe_delete更好?

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副本不受影响.

但是,如果你必须这样做,那么使用模板 - 宏总是有可能在其他名称上进行打击.

  • +1删除后将指针设置为NULL很少有意义. (3认同)

Bod*_*sen 7

删除一个;

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的问题(错误的安全感).


Joh*_*itb 6

显然功能,原因很简单.宏多次计算其参数.这可能有邪恶的副作用.该函数也可以作用域.没有比这更好的了:)


gim*_*mpf 5

通常,首选内联函数而不是宏,因为宏不考虑范围,并且在预处理期间可能与某些符号冲突,从而导致非常奇怪的编译错误.

当然,有时模板和功能不会,但在这种情况并非如此.

此外,更好的安全删除不是必需的,因为您可以使用智能指针,因此不需要记住在客户端代码中使用此方法,而是封装它.

(编辑),正如其他人所指出的,安全的,删除是不是安全,因为即使有人也不会忘记使用它,它仍然可能不会收到预期的效果.所以它实际上完全没有价值,因为正确使用safe_delete需要更多的思考,而不仅仅是自己设置为0.