-4
#define SAFE_DELETE(p)              {if(NULL != p) {delete p; p = NULL;}}

删除p后是否需要p=null?

如果需要,为什么需要它?

4

2 回答 2

3

不需要。_ 这只是一个额外的安全性。删除内容会使数据无效。如果您在删除它后尝试取消引用p,则会将自己暴露在未定义的行为中。通过将其设置为NULL,您清楚地表明该指针不再有效(并且可以使用类似的东西轻松检查if (p != NULL) {...},而您无法检查数据是否已被释放)。

于 2013-05-09T01:25:40.687 回答
1

不允许双重删除/释放,以下代码在运行时导致“双重释放错误”:

  • delete p; delete p;
  • free(p); free(p);

但删除/释放 NULL 点是可以的:

  • delete NULL;// 什么也没做
  • free(NULL);// 什么也没做

您不必在删除/释放指针之前检查指针是否为空,C/C++ 标准允许将 NULL 传递给删除/释放。所以在释放/删除之前检查指针是否为空不是“必须”的。这个,你SAFE_DELETE(P)可以安全地简化为

#define SAFE_DELETE(p) do { delete p; p = NULL; } while (0);

在释放/删除后将指针设置为 NULL 是为了确保您不会在以后释放/删除它。

于 2013-05-09T03:23:29.147 回答