Я использую C ++ в Windows 7 с MSVC 9.0, а также могу протестировать и воспроизвести в Windows XP SP3 с MSVC 9.0 .
Если я выделяю 1 ГБ из объектов размером 0,5 МБ, когда я их удаляю, все в порядке и ведет себя должным образом. Однако, если я выделяю 1 ГБ объектов размером 0,25 МБ при их удалении, память остается зарезервированной (желтая в Address Space Monitor ), и с этого момента ее можно будет использовать только для выделений размером менее 0,25 МБ. .
Этот простой код позволит вам протестировать оба сценария, изменив структуру с определением типа. После того, как он выделил и удалил структуры, он затем выделит 1 ГБ из 1 МБ буферов символов, чтобы увидеть, будут ли буферы символов использовать память, которую когда-то занимали структуры.
struct HalfMegStruct
{
HalfMegStruct():m_Next(0){}
/* return the number of objects needed to allocate one gig */
static int getIterations(){ return 2048; }
int m_Data[131071];
HalfMegStruct* m_Next;
};
struct QuarterMegStruct
{
QuarterMegStruct():m_Next(0){}
/* return the number of objects needed to allocate one gig */
static int getIterations(){ return 4096; }
int m_Data[65535];
QuarterMegStruct* m_Next;
};
// which struct to use
typedef QuarterMegStruct UseType;
int main()
{
UseType* first = new UseType;
UseType* current = first;
for ( int i = 0; i < UseType::getIterations(); ++i )
current = current->m_Next = new UseType;
while ( first->m_Next )
{
UseType* temp = first->m_Next;
delete first;
first = temp;
}
delete first;
for ( unsigned int i = 0; i < 1024; ++i )
// one meg buffer, i'm aware this is a leak but its for illustrative purposes.
new char[ 1048576 ];
return 0;
}
Ниже вы можете увидеть мои результаты из Address Space Monitor . Позвольте мне подчеркнуть, что единственное различие между этими двумя конечными результатами - это размер структур, выделяемых до маркера 1 ГБ .
Это кажется мне довольно серьезной проблемой, и ее так много люди могли страдать и даже не подозревать об этом.