初学者求教个有关问题,这段代码是否会造成内存泄漏

菜鸟求教个问题,这段代码是否会造成内存泄漏
WORD *pwPortNum = new WORD[20];
delete pwPortNum;

求教大神,这个代码是否会内存泄漏???

------解决方案--------------------


WORD *pwPortNum = new WORD[20];
delete []pwPortNum;

------解决方案--------------------
不会
带不带[]只影响对所申请的空间内的对象是执行一次还是执行多次析构函数,对于没有析构函数的基础数据类型,delete和delete[]没有区别
------解决方案--------------------
删除数组需要用 delete []; 否则是未定义行为。
------解决方案--------------------
对于基本数据类型 delete 与 delete[]是等价的, 只有自定义类型才不同, 因为delete[]分别调用数组中每个的析构函数, 而delete只会调用第一个的析构函数.
------解决方案--------------------
引用:
我给的那个链接里的!就是基本类型char数组的!


你说的那个链接, 我也仔细看了,里面最后的结论还是只说没有配对使用, 行为未定义 .
但至少在VS2008中测试那是等价的, 并不是说从程序代码执行结果来看的.

依据如下:
首先, 对于自定义的类,或者数据结构, 使用new[]分配, 你可以通过如下方式获取分配的对象个数.
A *pA = new A[11];
int nCount = *((int *)pA-1);
但使用new 单个对象是没有个数的.
对于基本数据类型, new与new[]都没有个数信息.

new[] 类为什么会有数据个数呢?, 答案就是为了在delete[]的时候循环调用析构函数.

因为在VS IDE中的基本数据类型是没有析构的, 所以即使new[]也不会去存放个数信息, delete时直接释放内存即可. 所以才有 new[]申请的, delete和delete[]释放都是一样的. 就相当于delete[]在基本数据类型的情况下, 自动退化成delete.

对于对象数组:
最终调用的是: 000BB7AF  call        CMutexeLock::`vector deleting destructor' (0A1D75h) 
vector deleting destructor  即一个数组的释放析构.
在这个call里面会先循环调用析构函数, 然后再调用一次delete[] 释放全部内存,最终调用一次free() (注意是一次)

而单个对象调用的是: 000BB85C  call        CMutexeLock::`scalar deleting destructor' (0A2207h) 
scalar deleting destructor 即一个确定数量的释放析构.
在这个call中, 也跟上面类似, 但只调用一次析构函数, 然后调用 delete释放内存, 最终调用一次free()

而对一普通数据类型, delete和delete[]都最终调用的都是一次free()函数.

所以综上, 可以得出一个结论: 对于自定义数据类型, 需要区分delete与delete[]的原因是要调用析构函数, 而对于普通数据类型, 由于没有析构函数, 所以就不用区分delete和delete[]了.