首先,根据C++标准,使用delete分配的任何内容new[]都是未定义的行为.
在Visual C++ 7中,这种配对可能导致两种后果之一.
如果类型new []'ed有简单的构造函数和析构函数VC++只是使用new而不是new[]和使用delete该块工作正常 - new只调用"分配内存",delete只调用"空闲内存".
如果new []'ed类型有一个非平凡的构造函数或析构函数,则无法完成上述技巧 - VC++ 7必须调用恰当数量的析构函数.因此它预先在数组中size_t存储元素的数量.现在,地址返回的地址new[]到第一个元素,而不是块的开头.因此,如果delete使用它只调用第一个元素的析构函数和调用"空闲内存",其地址不同于"分配内存"返回的地址,这导致HeapFree()内部的一些错误指示我怀疑是指堆腐败.
然而,每个人都可以阅读使用deleteafter new[]导致内存泄漏的错误陈述.我怀疑任何大小的堆损坏都比仅为第一个元素调用析构函数并且可能没有调用的析构函数没有释放堆分配的子对象这一事实重要得多.
如何使用delete之后new[]可能只会导致某些C++实现中的内存泄漏?