我们曾经不止一次的在很多地方甚至教课书上看到过以下关于delete和delete[]的说法(主要看红字部分。。回想一下大学老师是不是这么教你的。。。。):
此图片来源:http://www.cnblogs.com/bizhu/archive/2012/09/09/2677830.html
然而。。现实是很残酷的。。。我可以很肯定的告诉你,以上的说法是完全错误的!只能说我们被教科书坑了好多年。。。。。
在上文中曾提到过,当动态申请内存的时候,系统会记录分配的内存首地址和整块内存大小。此信息保存在CrtMemBlockHeader中,具体可以参考VC目录下CRT\SRC\DBGDEL.cpp。当我们释放内存的时候,系统会根据你给出的内存首地址(指针)来找到当时分配的内存大小,并释放这块区域。
也就是说
int* p = new int[10];
delete p; 完全等价于 delete[] p;
我们可以做个试验来证明:

常见的说法认为delete和delete[]的区别在于内存释放方式,但实际上是错误的。真相是它们在释放内存时并无明显差异,都会根据指针找到内存块并释放。然而,关键区别在于析构函数的调用:delete仅调用第一个元素的析构函数,而delete[]会调用所有元素的析构函数。因此,对于包含指针成员的对象数组,应使用delete[]以避免内存问题。
最低0.47元/天 解锁文章
830

被折叠的 条评论
为什么被折叠?



