删除指针的后遗症

The after-effects of deleting a pointer

本文关键字:后遗症 指针 删除      更新时间:2023-10-16
Object *p = new Object();
delete p;

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

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

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

这里的指针被称为悬空指针,这是一个你通常想不惜一切代价避免的怪物。

执行delete p时。p指向的内存被删除。

delete~=析构函数+解除分配

这里delete只是一个,它表示内存被释放。对OS的内存总量或变量p本身没有影响。p仍然指向现在由系统回收的内存,因此成为悬挂指针

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