Eli*_*Eli 7 c++ memory-management
在软件会议中进行讨论之后,我已经着手查明是否删除带有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<BLOCK_SIZE;j++) p[j]= j % 2;
Sleep(1000);
delete p;
}
}
Run Code Online (Sandbox Code Playgroud)
我比使用任务管理器监视我的应用程序的内存消耗,令人惊讶的是内存被正确分配和释放,分配的内存没有像预期的那样稳定增加
我修改了我的测试程序来分配一个非原始类型的数组:
#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;
}
}
Run Code Online (Sandbox Code Playgroud)
运行10分钟后,内存没有明显的增加
我用警告级别4编译了项目并没有收到任何警告.
视觉工作室运行时是否有可能跟踪分配的对象类型,以便在该环境之间delete
和之间没有区别delete[]
?
Chr*_*cke 19
delete p,其中p是一个数组,称为未定义行为.
具体来说,当你分配一个原始数据类型(int)数组时,编译器没有很多工作要做,所以它把它变成一个简单的malloc(),所以delete p可能会起作用.
删除p通常会在以下情况下失败:
sha*_*oth 17
不,这是未定义的行为.不要这样做 - 使用delete[]
.
在VC++ 7到9中,当有问题的类型具有简单的析构函数时,它恰好可以工作,但它可能会停止处理更新的版本 - 通常具有未定义行为的东西.反正不要这样做.