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

What happens if you apply delete[] to a non-array pointer?

本文关键字:指针 什么情况 数组 delete 应用于 如果      更新时间:2023-10-16

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

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

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

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

这并非总是正确的。因为new、new[]、delete、delete[]运算符也可以重载,所以使用delete而不是delete[](或相反)可以产生巨大的差异。

此外,某些编译器使用此处描述的过度分配技术。因此,在非数组指针上应用 delete[] 会导致未定义的行为。

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

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

当然,在实践中,我无法想到你在哪里将使用新的数组,因此您几乎可以忘记delete[].