为什么在c ++中释放对象的指针类型时需要p = NULL?

时间:2013-05-09 01:23:20

标签: c++ pointers

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

如果在删除p后需要p = null

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

不允许双删除/免费,以下代码在运行时产生“双重免费错误”:

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

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

  • delete NULL; //什么都不做
  • free(NULL); //什么都不做

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

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

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