如何替换删除和删除[]

时间:2014-11-11 16:29:29

标签: c++

我想将deletedelete[]替换为_delete ptr; 我需要它,因为delete方法没有将ptr设置为NULL。例如,现在我使用此代码进行内存清理:

#define _delete( ptr )    { delete ptr; ptr = NULL; }
#define _deleteA( ptr )   { delete [] ptr; ptr = NULL; }

MyClass *cls = new MyClass();
int *value = new int value[100];
....
_delete(cls);
_deleteA(value);

但我想使用我的功能:

_delete cls;
_delete value;

可能吗?

或者如果不是如何替换它:

_delete cls;
_delete[] value;

2 个答案:

答案 0 :(得分:3)

这不是一个好主意。宏并不适合这项工作。除了它可能无法实现之外,任何维护代码的人都会感到困惑。有几种更好的选择。

如果你有C ++ 11,你应该尽可能使用std::unique_ptrstd::shared_ptr之类的智能指针。 MatthiasB也提出了一个有效的观点,即您应该选择利用标准库并使用std::vector而不是动态分配的数组。

否则,您可以利用valgrindLLVM's AddressSanitizer等工具。它在Clang中可用,并已移植到GCC 4.9。要使用它,请在命令行中指定-fsanitize=address

如果您坚持要进行文本替换,那么在您喜欢的IDE中进行手动搜索和替换可能会有所帮助。我不会推荐它。

Is it good practice to NULL a pointer after deleting it?中的讨论表明,这种做法表明了您计划中可能存在的设计问题。例如,jalf's answer

  

在删除指向的内容后将指针设置为NULL   当然不能伤害,但它往往是一个更多的创可贴   基本问题:为什么你首先使用指针?一世   可以看出两个典型的原因:

     
      
  • 你只是想在堆上分配一些东西。在这种情况下,将它包装在RAII对象中会更加安全和清洁。   当您不再需要该对象时,结束RAII对象的范围。那是   std::vector如何运作,它解决了意外问题   将指针留给释放的内存。没有指针。
  •   
  • 或许你想要一些复杂的共享所有权语义。从new返回的指针可能与那个指针不同   呼叫delete。多个对象可能已使用该对象   同时在此期间。在这种情况下,共享指针或   类似的东西本来是更可取的。
  •   
     

我的经验法则是,如果你在用户代码中留下指针,   你这样做是错的。指针不应该指向   垃圾首先。为什么没有一个对象   确保其有效性的责任?为什么它的范围没有结束   什么时候指向对象呢?

答案 1 :(得分:2)

这是不可能的。但是,您可以查看可能有用的帖子Here