可能重复:
Why is there a special new and delete for arrays?
( POD )freeing memory : is delete[] equal to delete ?
如果我使用delete p而不是delete [] p作为数组,会得到什么结果? 我遇到了这个问题的两个答案。
1只释放第一个元素。
2发生了灾难性的结局。
我的问题是,这两个怎么会发生?如果只释放第一个元素,为什么会有灾难?任何人都可以举个例子吗?
答案 0 :(得分:5)
您将获得undefined behavior。
答案 1 :(得分:4)
这是未定义的行为。
这意味着标准保证内存管理库的编写者存在某些先决条件(在这种情况下,将使用delete []删除数组。)
如果你打破这些前提条件,那么内存管理库可能会以某种方式失败。它如何失败将取决于库的实现方式。但是由于C ++是为速度而设计的,因此结果可能不会很好。所以通常这意味着内部存储器管理数据结构以某种方式被破坏。这可能会导致程序的其他部分出现问题。
如果您构建调试模式(在某些编译器上),他们将使用特别版本的内存管理库,该库设计为更强大。因此,在这些情况下,可能不会崩溃,但额外的检查已明确添加到库中,因此结果较慢。但你仍然不能保证正确的行为。
答案 2 :(得分:1)
如果只释放了第一个元素,那么你已经泄露了数组的其余部分。
经过多次迭代后,内存不足。
另一方面,如果它是未定义的行为,“灾难性的结束”可能而是由于你的鼻腔内飞出的恶魔瞬间死亡。