在软件会议中进行讨论之后,我已经着手查明是否删除带有plain的动态分配的primitives数组delete
会导致内存泄漏.
我编写了这个小程序并使用在Windows XP上运行的visual studio 2008进行编译:
#include "stdafx.h" #include "Windows.h" const unsigned long BLOCK_SIZE = 1024*100000; int _tmain() { for (unsigned int i =0; i < 1024*1000; i++) { int* p = new int[1024*100000]; for (int j =0;j我比使用任务管理器监视我的应用程序的内存消耗,令人惊讶的是内存被正确分配和释放,分配的内存没有像预期的那样稳定增加
我修改了我的测试程序来分配一个非原始类型的数组:
#include "stdafx.h" #include "Windows.h" struct aStruct { aStruct() : i(1), j(0) {} int i; char j; } NonePrimitive; const unsigned long BLOCK_SIZE = 1024*100000; int _tmain() { for (unsigned int i =0; i < 1024*100000; i++) { aStruct* p = new aStruct[1024*100000]; Sleep(1000); delete p; } }运行10分钟后,内存没有明显的增加
我用警告级别4编译了项目并没有收到任何警告.
视觉工作室运行时是否有可能跟踪分配的对象类型,以便在该环境之间
delete
和之间没有区别delete[]
?
1> Chris Becke..:delete p,其中p是一个数组,称为未定义行为.
具体来说,当你分配一个原始数据类型(int)数组时,编译器没有很多工作要做,所以它把它变成一个简单的malloc(),所以delete p可能会起作用.
删除p通常会在以下情况下失败:
p是一个复杂的数据类型 - 删除p; 不会知道打电话给个人的析构函数.
"user"重载operator new []和delete []以使用不同的堆到常规堆.
调试运行时重载operator new []和delete []以添加数组的额外跟踪信息.
编译器决定它需要存储额外的RTTI信息以及删除p的对象; 不明白,但删除[] p; 将.
2> sharptooth..:不,这是未定义的行为.不要这样做 - 使用
delete[]
.在VC++ 7到9中,当有问题的类型具有简单的析构函数时,它恰好可以工作,但它可能会停止处理更新的版本 - 通常具有未定义行为的东西.反正不要这样做.