C++ 删除指针的后效

C++ 删除指针的后效,c++,memory-management,C++,Memory Management,当我删除p时,堆上的对象分配被删除。但p本身到底发生了什么?它是否从堆栈中删除?或者它仍然在堆栈中,并且仍然包含以前保存对象的内存地址?p仍然在堆栈中,并且保存您刚刚删除的对象的地址。您可以自由地重用p,将其分配给指向其他分配的数据或NULL/nullptr您在这里得到的被称为-一个您通常希望不惜任何代价避免的怪物。p是一个变量,对吗。因此,它的生存期是在编译时确定的,而不是在运行时确定的。当您执行delete p时。由p指向的内存被删除 delete~=析构函数+释放 这里delete只是一个

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

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

您在这里得到的被称为-一个您通常希望不惜任何代价避免的怪物。

p
是一个变量,对吗。因此,它的生存期是在编译时确定的,而不是在运行时确定的。

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

delete
~=析构函数+释放


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

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

除了说
删除p
是创建悬空指针的原因,因为指针仍然存在,而您只是使其值无效。你不能完全避开它们;你所能做的就是避免使用它,比如什么?如果对象被有序地清除并且指针被安全地使用(即,在使用之前检查它是否为NULL),我看不到任何陷阱。@KBart:让我重复一下:
delete NULL什么也不做。因此
如果(p)删除p;/*否则什么都不做*/
也会做同样的事情。您甚至提到了“悬空指针”的邪恶,从而将内存管理引入了等式中。在单个语句的上下文中,术语本身是不相关的<编码>删除p
就其本质而言,使
p
成为一个悬空指针,因此您不能“不惜任何代价”避免悬空指针,而仍然使用
delete
。至于指针悬空的问题?它完全属于内存管理领域。所以你不能说“悬空指针不好”,然后说内存管理不是讨论的一部分P@AdriC.S.:例如,双重删除。如果您删除一个指针,然后自动否认它的所有知识(通过将其置零),这会使查找恶意删除程序的问题变得复杂。作为病理病例,
删除p;p=nullptr;删除p不会被注意到,而
删除p;删除p更可能导致问题。你可能会说,人们希望避免令人讨厌的副作用,但我会说,当代码没有密谋隐藏问题时,更容易注意到问题。而且,当违规代码没有抹去其参与的证据时,更容易找到他们。nullptr是一个保存的单词吗?比如:p=nullptr@还有一点:在C++11中是这样的。瞧,非常感谢你的帮助。
Object *p = new Object();
delete p;