我想将delete
和delete[]
替换为_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;
答案 0 :(得分:3)
这不是一个好主意。宏并不适合这项工作。除了它可能无法实现之外,任何维护代码的人都会感到困惑。有几种更好的选择。
如果你有C ++ 11,你应该尽可能使用std::unique_ptr
和std::shared_ptr
之类的智能指针。 MatthiasB也提出了一个有效的观点,即您应该选择利用标准库并使用std::vector
而不是动态分配的数组。
否则,您可以利用valgrind和LLVM'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。