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

Why deleteing a pointer twice will cause crash?

本文关键字:两次 崩溃 删除 指针 为什么      更新时间:2023-10-16

可能重复:
为什么两次调用时Free崩溃

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

很难准确预测会发生什么——这在一定程度上取决于编译器,在很大程度上依赖于标准库。官方称,这只是未定义的行为,所以几乎任何事情都可能发生。

最常见的情况是垃圾堆会被丢弃。它可能不会检查删除的内容是否有效,因此当它在同一地址获得两个块时,它可能(例如(仍然将它们视为两个单独的块,因此当您稍后分配内存时,您可能会两次获得相同的内存块。在其他一些情况下,它可能(例如(只是补充了一点,说明该内存块是否正在使用中,所以当你第二次删除它时,你实际上会将其标记为再次使用,这样内存就再也无法分配了,而你基本上只是创建了一个泄漏。

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

确实如此。

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

因为这样做是非法的,所以内部算法不会浪费时间,每次你试图释放一些东西时都会仔细检查内存所有权,假设你足够明智,不这样做。

当然,这样做的副作用是你会破坏你的记忆,让事情变得一团糟。

真正具体的例子的分析远远超出了Stack Overflow的范围,甚至超出了理智的范围。不过,这个对可能重复的问题的回答做得很好。

为什么free()每次都不能检查它的"记录"?因为C++的设计原则是不做它不需要做的事情。如果你是一个理智的程序员,你不会在同一块内存上调用free()两次,那么你为什么要让你的程序在毫无意义的检查上浪费时间和资源呢?你不会的。语言的原则(实际上还有常识(规定这些检查是而不是自动执行的

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