Object *p = new Object();
delete p;
当我删除p时,删除堆上的对象分配。但是p本身究竟发生了什么?它是从堆栈中删除的吗?或者它仍然在堆栈中,仍然包含以前保存对象的内存地址?
答案 0 :(得分:8)
p
仍然在堆栈中,并保留您刚刚删除的Object
的地址。您可以自由重复使用p
,将其指定为指向其他已分配的数据或NULL
/ nullptr
。
答案 1 :(得分:2)
p
是一个变量,对吧。所以它的生命周期是在编译时确定的,而不是在运行时确定的。
答案 2 :(得分:0)
你在这里得到的是dangling pointer - 你通常想要不惜一切代价避免的怪物。
答案 3 :(得分:0)
执行delete p
时。 p
指向的内存将被删除。
delete
〜=析构函数+释放
此处delete
只是一个术语,表示已释放内存。对OS的总内存量或变量p
本身没有影响。 p
仍然指向系统现在回收的内存,因此成为悬空指针。
答案 4 :(得分:0)
指针变量仍然存在,但其值变为无效 - 除了分配另一个有效指针或空指针之外,对其执行任何操作都会产生未定义的行为。 There's no guarantee the pointer value is unchanged