如果将delete []应用于非数组指针会发生什么?

时间:2015-01-04 22:44:40

标签: c++ arrays memory-management memory-leaks delete-operator

如果在C ++中对数组应用“delete”而不是“delete []”,则会产生内存泄漏,因为只会删除第一个元素。但是如果你意外地将“delete []”应用于非数组指针会发生什么?例如(只是一个玩具示例):

   class X {   
      void  foo()
      {
          X* x = new X();
          delete[] x; // What happens here?
      }
   };

它可以造成任何伤害吗?如果是这样,有什么害处?

2 个答案:

答案 0 :(得分:1)

  

如果在C ++中对数组应用“delete”而不是“delete []”,则会产生内存泄漏,因为只会删除第一个元素。

并非总是如此。由于新[] 删除删除[] 运算符也可以重载,使用delete代替删除[](或其他方式)可以产生巨大的差异。

此外,一些编译器使用{{3>}描述的过度分配技术。因此,对非数组指针应用delete []会导致未定义的行为。

答案 1 :(得分:1)

如果您使用的是需要delete的简单delete[],则不会 有内存泄漏,你有未定义的行为。在很多情况下,你 将破坏自由空间的竞技场,导致后来的程序崩溃,但是 当然,未定义的行为是未定义的,所以任何事情都可能发生。

使用需要简单delete[]的{​​{1}}也是未定义的 行为;在实践中,它也经常导致腐败的自由 太空竞技场,或其他丑陋的结果。

当然,在实践中,我无法想到你在哪里 会使用数组new,所以你几乎可以忘记delete