Почему удаленная память не может быть повторно использована

Я использую 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 ГБ .

Quarter MegHalf Meg

Это кажется мне довольно серьезной проблемой, и ее так много люди могли страдать и даже не подозревать об этом.

  • Так это намеренно или это следует считать ошибкой?
  • Могу ли я сделать небольшие удаленные объекты свободными для использования в больших дисках памяти?
  • И многое другое из любопытства, страдает ли компьютер Mac или Linux от той же проблемы?

7
задан 0xC0DEFACE 24 March 2011 в 08:29
поделиться