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

why need p=NULL when releasing pointer type of object in c++?

本文关键字:NULL 类型 指针 c++ 释放 对象 为什么      更新时间:2023-10-16
#define SAFE_DELETE(p)              {if(NULL != p) {delete p; p = NULL;}}

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

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

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

double delete/free是不允许的,以下代码会在运行时导致"double free错误":

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

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

  • delete NULL;//什么都不做
  • free(NULL);//什么都不做
在删除/释放指针之前,你不必检查指针是否为空,C/c++标准允许将null传递给delete/free。因此,在free/delete之前检查指针是否为空并不是"必须"的。这样,您的SAFE_DELETE(P)可以安全地简化为
#define SAFE_DELETE(p) do { delete p; p = NULL; } while (0);

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