如果我使用delete p而不是delete [] p作为数组,结果是什么?

时间:2009-12-16 20:23:27

标签: c++

  

可能重复:
  Why is there a special new and delete for arrays?
  ( POD )freeing memory : is delete[] equal to delete ?

如果我使用delete p而不是delete [] p作为数组,会得到什么结果? 我遇到了这个问题的两个答案。

1只释放第一个元素。

2发生了灾难性的结局。

我的问题是,这两个怎么会发生?如果只释放第一个元素,为什么会有灾难?任何人都可以举个例子吗?

3 个答案:

答案 0 :(得分:5)

您将获得undefined behavior

答案 1 :(得分:4)

这是未定义的行为。

这意味着标准保证内存管理库的编写者存在某些先决条件(在这种情况下,将使用delete []删除数组。)

如果你打破这些前提条件,那么内存管理库可能会以某种方式失败。它如何失败将取决于库的实现方式。但是由于C ++是为速度而设计的,因此结果可能不会很好。所以通常这意味着内部存储器管理数据结构以某种方式被破坏。这可能会导致程序的其他部分出现问题。

如果您构建调试模式(在某些编译器上),他们将使用特别版本的内存管理库,该库设计为更强大。因此,在这些情况下,可能不会崩溃,但额外的检查已明确添加到库中,因此结果较慢。但你仍然不能保证正确的行为。

答案 2 :(得分:1)

如果只释放了第一个元素,那么你已经泄露了数组的其余部分。

经过多次迭代后,内存不足。

另一方面,如果它是未定义的行为,“灾难性的结束”可能而是由于你的鼻腔内飞出的恶魔瞬间死亡。