在一次软件会议的讨论中,我着手调查使用普通的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<BLOCK_SIZE;j++) p[j]= j % 2;
Sleep(1000);
delete p;
}
}
我随后使用任务管理器监测了我的应用程序的内存消耗,令人惊讶的是,内存被正确地分配和释放,分配的内存并没有像预期的那样稳定增加。
我修改了我的测试程序以分配非基元类型的数组:
#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编译项目,并没有收到警告。
在Visual Studio运行时,是否可能跟踪分配的对象类型,因此在该环境中delete
和delete[]
之间没有区别?
shared_ptr<int>
数组进行测试,您将看到您的实现是否使delete
和delete[]
等效。在C ++中总是对人们知道是错误的事情产生着迷,明确声明为错误的事情,但似乎有时可能会起作用;-) - Steve Jessopdelete
和delete[]
之间的区别,但对于仅在MSVC代码中使用POD类型数组时,我聪明地故意使用delete
,以优化节省两个额外字符的输入。”你并没有,你只是忘记了。承认错误,纠正它,停止浪费时间争论;-) - Steve Jessop