int main(){
Employee *e = new Employee();
delete e;
delete e;
...
delete e;
return 0;
}
答案 0 :(得分:38)
e
不是引用,它是指针。如果您尝试通过一次指针delete
一个对象,则会得到未定义的行为。
这意味着从“出现工作”到“崩溃”或完全随机的事情几乎可以发生任何事情。
答案 1 :(得分:18)
这是未定义的行为,所以任何事情都可能发生。
可能发生的事情很糟糕。通常,免费存储是一个精心管理的免费和分配块系统,new
和delete
进行簿记以使所有内容保持一致状态。如果再次delete
,系统可能会对无效数据执行相同的簿记,并且突然免费存储处于不一致状态。这被称为“堆腐败”。
一旦发生这种情况,您使用new
或delete
执行的操作可能会产生不可预测的结果,包括尝试在应用程序的内存区域外写入,静默地破坏数据,错误地认为没有更多内存,或双重或重叠分配。如果你很幸运,程序很快就会崩溃,尽管你仍然有问题找出原因。如果你运气不好,它会继续运行,结果不好。
答案 2 :(得分:11)
除了旧的看到“未定义的行为”,意味着任何事情都可能从无到有,发生在主要记忆中开放的第7个圈子的通道,在实践中在大多数情况下通常会发生什么实现是程序将继续运行删除,然后在某些不相关的内存分配中稍后神秘地崩溃。
答案 3 :(得分:4)
您可能会冒险进入“未定义的行为”领域。
在许多系统上,这会导致崩溃;例如,在我的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]
答案 4 :(得分:3)
如果你真的很幸运,它会崩溃。通常情况下,它会存储业力,直到您的CEO向最重要的新客户展示代码,直到它会破坏/销毁所有数据。
在检查或调试版本中,经常会捕获到这种类型的东西,但它可以完全检测不到并在以后造成破坏。当涉及多个线程时,这尤其深刻。
答案 5 :(得分:3)
如果您担心这可能会在您的应用中发生,请完全停止使用原始指针,这样您就不需要删除(例如切换到shared_ptr
)或始终设置指向NULL
的指针(或0或更好的nullptr
)删除它们之后。在空指针上调用delete绝对不会做任何事情。
答案 6 :(得分:2)
这不安全,并且未定义实际可能发生的事情:
http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.2