为什么在c++中释放对象的指针类型时需要p=NULL ?
why need p=NULL when releasing pointer type of object in c++?
#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);
//什么都不做
SAFE_DELETE(P)
可以安全地简化为
#define SAFE_DELETE(p) do { delete p; p = NULL; } while (0);
在free/delete之后设置指针为NULL是为了确保以后不会释放/删除它。
相关文章:
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 视觉C++ dynamic_cast返回 NULL,尽管对象是派生类型
- FindResource 调用返回 RCDATA 类型的文本文件的 NULL
- 排序时引用绑定到 'value_type' 类型的 null 指针
- 类返回对象类型,但如何返回和检查 null
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 我可以根据null或特定类型的值检查引用吗
- 函数中类型错误的值C++始终为 NULL
- 引用绑定到类型 'struct value_type' 的 null 指针
- 如果 std::shared_ptr 是从非 null 构造的,为什么它不需要知道完整的类型?
- QList<float* 类型的 NULL 返回值>
- 赋值null中的不兼容类型
- 从SQL Server返回C++本机客户端中的NULL数据类型
- 当返回类型不是指针时返回NULL
- 为什么当返回类型为 int 时不能使用返回 NULL
- 如何使用特定类型创建 NULL
- srand(time(NULL)):错误 C4430:缺少类型说明符 - 假定为 int.注意:C++不支持默认整数
- 如何通过COM公开可为null的类型
- 在QML中将null分配给C++类型的QObject*属性时断言失败