после обсуждения на совещании по программному обеспечению, которое я намеревался выяснить, приведет ли удаление динамически размещенного массива примитивов с простым delete
к утечке памяти.
Я написал эту крошечную программу и скомпилировал ее с Visual Studio 2008, работающей на Windows XP:
#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[]
в этой среде?