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

问题描述:

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

如果在删除p后需要p = null?为什么在C++中释放对象的指针类型时需要p = NULL?

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

+1

大概是这样,第二次尝试不会尝试第二次删除它....! – 2013-05-09 01:24:27

+1

只有错误的代码需要在删除它之后将指针设置为NULL。 – Praetorian 2013-05-09 01:28:22

+0

@Praetorian:这就是为什么叫做SAFE_DELETE! :) – 2013-05-09 01:33:28

双删除/免费是不允许的,以下代码导致运行时间期间一个 “双无差错”:

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

但删除/释放空点行:

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

你不必检查指针为空或不删除/释放之前,C/C++标准允许NULL被传递到删除/免费。因此在释放/删除之前,检查指针是否为空或不是“必须”。 这一点,你SAFE_DELETE(P)可以安全地被简化为

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

免费后设置指针为NULL /删除是确保你没有*/在一段时间以后将其删除。

这不是需要。这只是增加的安全性。删除内容会导致数据无效。如果您在删除p后尝试解除引用,那么您将面临未定义的行为。通过将其设置为NULL,您清楚地表明该指针不再有效(并且可以使用类似if (p != NULL) {...}的方式轻松检查,但无法检查数据是否已被释放)。