3
Object *p = new Object();
delete p;

当我删除 p 时,堆上的对象分配被删除。但是 p 本身到底发生了什么?它是否从堆栈中删除?还是它仍然在堆栈中并且仍然包含先前保存对象的内存地址?

4

5 回答 5

8

p仍在堆栈中,并保存Object您刚刚删除的地址。您可以自由重用p,将其指定为指向其他分配的数据或NULL/ nullptr

于 2013-02-05T14:57:20.183 回答
2

p是一个变量,对。所以它的生命周期是在编译时确定的,而不是在运行时。

于 2013-02-05T14:59:40.027 回答
0

你在这里得到的东西叫做悬空指针——一个你通常会不惜一切代价避免的怪物。

于 2013-02-05T14:58:46.003 回答
0

当你执行delete p. 所指向的内存p被删除。

delete~= 析构函数 + 释放

这里delete只是一个说明内存被释放的术语。对操作系统的内存总量或变量p本身没有影响。p仍然指向现在被系统回收的内存,因此成为一个悬空指针

于 2013-02-05T14:59:43.423 回答
0

指针变量仍然存在,但它的值被渲染为无效 - 除了分配另一个有效指针或空指针之外,对其进行任何操作都会产生未定义的行为。不能保证指针值不变

于 2013-02-05T15:01:03.733 回答