首先,根据C++标准,对使用
在Visual C++7中,这种配对可能会导致两种结果之一。
如果
如果
然而,偶尔会读到错误的说法,即在
在某些C++实现中,如何可能仅通过在
new[]
分配的任何内容使用delete
都是未定义行为。在Visual C++7中,这种配对可能会导致两种结果之一。
如果
new[]
分配的类型具有平凡的构造函数和析构函数,VC++会简单地使用new
而不是new[]
,对该块使用delete
是可以正常工作的 - new
只调用“分配内存”,delete
只调用“释放内存”。如果
new[]
分配的类型具有非平凡的构造函数或析构函数,则无法使用上述技巧 - VC++7必须调用恰好正确数量的析构函数。因此,它在数组前面添加了一个size_t
,存储元素的数量。现在new[]
返回的地址指向第一个元素,而不是整个块的开头。因此,如果使用delete
,它仅调用第一个元素的析构函数,并以与“分配内存”返回的地址不同的地址调用“释放内存”,这会导致HeapFree()中出现一些错误指示,我怀疑它指的是堆损坏。然而,偶尔会读到错误的说法,即在
new[]
后使用delete
会导致内存泄漏。我怀疑,任何堆损坏的大小都比只调用第一个元素的析构函数更重要,可能没有调用析构函数释放堆分配的子对象。在某些C++实现中,如何可能仅通过在
new[]
后使用delete
导致内存泄漏呢?