当你在C ++中释放两次或更多的指针时会发生什么?
int main(){ Employee *e = new Employee(); delete e; delete e; ... delete e; return 0; }
e
不是一个参考,它是一个指针。 如果你试图通过一个指针来delete
一个对象,那么你会得到未定义的行为 。
这意味着几乎任何事情都可能从“出现工作”到“崩溃”或完全随机的事情发生。
这是未定义的行为,所以任何事情都可能发生。
可能发生的事情很糟糕。 通常情况下,免费商店是一个精心pipe理的免费和分配块体系, new
和delete
function可以使所有内容保持一致。 如果再次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是无保证的。