【问题标题】:How to replace delete and delete []如何替换delete和delete []
【发布时间】:2015-01-08 06:48:40
【问题描述】:

我想用_delete ptr替换deletedelete[]; 我需要它,因为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;

【问题讨论】:

  • class 是 C++ 中的关键字。
  • 我怀疑这是有效的语法
  • 不,这不可能。他们都不是。
  • 这也是一个相当无意义的练习,因为它只解决了与指针相关的问题的一小部分,而且只解决了那些简单的问题。考虑当您有多个指向同一内存的指针时会发生什么。
  • 使用向量和智能指针,你再也不用写 delete 了。

标签: c++


【解决方案1】:

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

如果您使用 C++11,则应尽可能使用智能指针,例如 std::unique_ptrstd::shared_ptrMatthiasB 还提出了一个有效的观点,即您应该选择利用标准库并使用 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 被调用。多个对象可能已使用该对象 同时。在这种情况下,共享指针或 类似的东西会更好。

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

【讨论】:

  • 不要忘记std::vector 用于动态数组,而不是在适用的情况下直接分配指针。
【解决方案2】:

这不可能。不过,您可以查看Here 发布的可能有用的答案。

【讨论】:

  • 阅读,有趣的是是否可以以某种方式替换或重写此方法
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
相关资源
最近更新 更多