首先,根据 C++ 标准,使用delete
任何分配的东西都是未定义的行为。new[]
在 Visual C++ 7 中,这种配对可能导致两种后果之一。
如果类型 new[]'ed 具有微不足道的构造函数和析构函数 VC++ 只是使用new
而不是new[]
使用delete
该块工作正常 -new
只需调用“分配内存”,delete
只需调用“空闲内存”。
如果类型 new[]'ed 具有非平凡的构造函数或析构函数,则上述技巧无法完成 - VC++7 必须调用正确数量的析构函数。所以它在数组前面加上一个size_t
存储元素的数量。现在返回的地址new[]
指向第一个元素,而不是块的开头。因此,如果delete
使用它只调用第一个元素的析构函数,并且调用“空闲内存”,其地址与“分配内存”返回的地址不同,这会导致 HeapFree() 内部出现一些错误指示,我怀疑这是指堆腐败。
然而,到处都可以读到使用delete
afternew[]
会导致内存泄漏的错误语句。我怀疑任何大小的堆损坏都比仅对第一个元素调用析构函数并且可能未调用的析构函数没有释放堆分配的子对象这一事实重要得多。
delete
使用after怎么new[]
可能只导致某些 C++ 实现的内存泄漏?