当你在C ++中释放两次或更多的指针时会发生什么?

int main(){ Employee *e = new Employee(); delete e; delete e; ... delete e; return 0; } 

e不是一个参考,它是一个指针。 如果你试图通过一个指针来delete一个对象,那么你会得到未定义的行为

这意味着几乎任何事情都可能从“出现工作”到“崩溃”或完全随机的事情发生。

这是未定义的行为,所以任何事情都可能发生。

可能发生的事情很糟糕。 通常情况下,免费商店是一个精心pipe理的免费和分配块体系, newdeletefunction可以使所有内容保持一致。 如果再次delete ,系统可能会对无效数据执行相同的簿记操作,并且突然间免费商店处于不一致的状态。 这被称为“堆腐败”。

一旦发生这种情况,你对new或者delete任何操作都可能产生不可预知的结果,包括尝试在应用程序的内存区域之外进行写操作,无声地破坏数据,错误地认为没有更多的内存,或者双重或重叠的分配。 如果你幸运的话,程序很快就会崩溃,尽pipe如此,你仍然会遇到问题。 如果你不走运,它将继续运行,结果不好。

除了旧的关于“未定义的行为”的含义,任何事情都可能从无到有,到主要记忆中开放的地狱的第七圈的通道, 实际上大多数实现中通常会发生的事情是,程序将继续运行在某些不相关的内存分配之后,某些时候会被删除,然后神秘地崩溃。

你可能冒险进入“未定义的行为”领域。

在许多系统上这将导致崩溃; 例如,在我的Linux机器上:

 *** glibc detected *** ./cctest: double free or corruption (fasttop): 0x0000000000d59900 *** ======= Backtrace: ========= /lib/libc.so.6[0x7f399f4cbdd6] /lib/libc.so.6(cfree+0x6c)[0x7f399f4d074c] ./cctest[0x400a7a] /lib/libc.so.6(__libc_start_main+0xfd)[0x7f399f474abd] ./cctest[0x400959] 

如果你真的很幸运,它会崩溃。 通常情况下,它会存储业力,直到你的首席执行官向最重要的新客户展示代码时,才会破坏/销毁他们的所有数据。

在检查或debugging版本中,经常会发现这样的事情,但它可能会被彻底检测到,并在以后造成严重破坏。 multithreading涉及时,这是特别深刻的。

这是不安全的,它不确定可能发生的事情:

http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.2

如果您担心这可能会发生在您的应用程序,或者完全停止使用原始指针,以便您不需要删除(例如切换到shared_ptr )或始终将指针设置为NULL (或0,或更好还nullptr )之后删除它们。 在一个空指针上调用delete是无保证的。