在C++中将指针解除分配两次或更多时会发生什么?

flo*_*pex 23 c++ pointers allocation dealloc

int main(){
Employee *e = new Employee();

delete e;
delete e;
...
delete e;
return 0;

}
Run Code Online (Sandbox Code Playgroud)

CB *_*ley 38

e这不是一个参考,它是一个指针.如果您通过指针尝试更多一次对象,则会得到未定义的行为delete.

这意味着从"出现工作"到"崩溃"或完全随机的事情几乎可以发生任何事情.

  • 那一刻它可能不会崩溃.但是如果它破坏了堆的一部分,那么很可能在之后的某个任意点发生崩溃.然而,它可能成为潜伏的定时炸弹.直到后来当一些看似无关的动作碰巧碰到损坏的部分然后*繁荣时才引起任何问题 (2认同)

Dav*_*ley 18

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

可能发生的事情很糟糕.通常,免费商店是一个精心管理的免费和分配块系统,newdelete进行簿记以使一切处于一致状态.如果delete再次,系统可能会对无效数据执行相同的簿记,并且突然免费存储处于不一致状态.这被称为"堆损坏".

一旦发生这种情况,任何你做newdelete可能有不可预测的结果,包括尝试在应用程序的内存区域外写,静默地破坏数据,错误地认为没有更多的内存,或双重或重叠分配.如果你很幸运,程序很快就会崩溃,尽管你仍然有问题找出原因.如果你运气不好,它会继续运行,结果不好.


Cra*_*rks 12

除了旧的看到"未定义的行为"意味着任何事情都可能发生在从主要内存中开放的第七个通道的网关,实际上在大多数实现中通常会发生的是程序将继续运行删除,然后在某些不相关的内存分配中稍后神秘地崩溃.

  • 经常当我得到神秘的记忆崩溃时,我*WISH*通往第七个地狱圈的门户已经在主记忆中打开了...... (3认同)