#define SAFE_DELETE(p) {if(NULL != p) {delete p; p = NULL;}}
删除p后是否需要p=null?
如果需要,为什么需要它?
不需要。_ 这只是一个额外的安全性。删除内容会使数据无效。如果您在删除它后尝试取消引用p
,则会将自己暴露在未定义的行为中。通过将其设置为NULL
,您清楚地表明该指针不再有效(并且可以使用类似的东西轻松检查if (p != NULL) {...}
,而您无法检查数据是否已被释放)。
不允许双重删除/释放,以下代码在运行时导致“双重释放错误”:
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 是为了确保您不会在以后释放/删除它。