#define SAFE_DELETE(p) {if(NULL != p) {delete p; p = NULL;}}
如果在删除p后需要p = null
如果需要,为什么需要呢?
答案 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是为了确保您以后不会释放/删除它。