Object *p = new Object();
delete p;
当我删除 p 时,堆上的对象分配被删除。但是 p 本身到底发生了什么?它是否从堆栈中删除?还是它仍然在堆栈中并且仍然包含先前保存对象的内存地址?
Object *p = new Object();
delete p;
当我删除 p 时,堆上的对象分配被删除。但是 p 本身到底发生了什么?它是否从堆栈中删除?还是它仍然在堆栈中并且仍然包含先前保存对象的内存地址?
p
仍在堆栈中,并保存Object
您刚刚删除的地址。您可以自由重用p
,将其指定为指向其他分配的数据或NULL
/ nullptr
。
p
是一个变量,对。所以它的生命周期是在编译时确定的,而不是在运行时。
你在这里得到的东西叫做悬空指针——一个你通常会不惜一切代价避免的怪物。
当你执行delete p
. 所指向的内存p
被删除。
delete
~= 析构函数 + 释放
这里delete
只是一个说明内存被释放的术语。对操作系统的内存总量或变量p
本身没有影响。p
仍然指向现在被系统回收的内存,因此成为一个悬空指针。
指针变量仍然存在,但它的值被渲染为无效 - 除了分配另一个有效指针或空指针之外,对其进行任何操作都会产生未定义的行为。不能保证指针值不变。