为什么两次删除指针会导致崩溃?

时间:2011-04-22 03:40:02

标签: c++

  

可能重复:
  Why Free crashes when called twice

我只是想知道当我们删除已经删除的指针时究竟发生了什么,以及导致崩溃的原因是什么?

3 个答案:

答案 0 :(得分:2)

很难准确预测将会发生什么 - 它取决于编译器,以及标准库上的很多东西。正式来说,它只是未定义的行为,所以几乎任何事情都可能发生。

最常见的事情是堆会被破坏。它可能无法检查删除是否有效,因此当它在同一地址获得两个块时,它可能(例如)仍然将它们视为两个独立的块,因此当您稍后分配内存时,您可能会获得相同的内存块两次。在其他一些情况下,它可能(例如)补充一点来说明是否正在使用该内存块,因此第二次删除它时,实际上最终会将其标记为再次使用,以便内存可以永远不会被再次分配,而你基本上只是创造了泄密。

答案 1 :(得分:2)

如果你买车,可以卖两次吗?没错,因为第二次你不再是它的拥有者。当您第一次删除指针时,您放弃了所有权,内存将返回到空闲池,准备再次发出。如果您第二次删除它,那么现在任何其他程序都可以使用该内存,当它们尝试访问它时会崩溃。希望这有用

答案 2 :(得分:0)

就是这样。

释放你不拥有的内存是非法的(如果你以前释放了一块内存,那么你就不再拥有它了。)

因为这样做是违法的,所以每次尝试释放内容时,内部算法都不会浪费时间仔细检查内存所有权,假设你有足够的智慧不执行

当然,这样做的副作用是你可能会破坏你的记忆并使事情变得混乱。

分析真正具体的例子远远超出Stack Overflow的范围,或者实际上是理智。 This answer对可能的重复问题做了很好的工作。

为什么free()每次都不能只检查其“记录”?因为C ++的设计原则是不做它不需要的东西。如果你是一个理智的程序员,你不会在同一块内存上调用free()两次,所以为什么你希望你的程序浪费时间和资源进行无意义的检查?你不会。语言的原则(实际上是常识)要求这些检查是自动执行。

旁注 - 我对“非法”一词的使用有点慷慨。在C ++的范围内,它只是“未定义的行为”。在实用性的范围内,这可能是同样的事情。