Realloc () не правильно освобождает память в Windows

Я пытаюсь использоватьперераспределить () в приложении Windows. Я выделяю большой блок памяти, затем используюперераспределить () чтобы уменьшить его позже, как только я знаю правильный размер.

Я считаю, что хотяперераспределить () кажется, работает правильно (память в диспетчере задач отражает то, что вы ожидаете) приложение в конечном итоге не хватает памяти. Из того, что я могу сказать, это как будтоrelloc () освобождает память, но не освобождает виртуальное адресное пространство, связанное с памятью. В следствии,таНос () в конечном итоге потерпит неудачу.

Вот небольшое консольное приложение, которое демонстрирует проблему:

int _tmain(int argc, _TCHAR* argv[])
{
    static const DWORD dwAllocSize = (50 * 1024 * 1024);
    static const DWORD dwReallocSize = 10240;
    static const DWORD dwMaxIterations = 200;

    BYTE* arpMemory[dwMaxIterations];
    memset( arpMemory, 0, sizeof(arpMemory) );

    for( DWORD i = 0; i < dwMaxIterations; i++ )
    {
        arpMemory[i] = (BYTE*) malloc( dwAllocSize );
        if( !arpMemory[i] )
        {
            printf("OUT OF MEMORY after %d iterations!\n", i);
            return -1;
        }

        BYTE* pRealloc = (BYTE*) realloc( arpMemory[i], dwReallocSize );
        if( !pRealloc )
        {
            printf("Realloc FAILED after %d iterations!\n", i);
            return -1;
        }
        else if( pRealloc != arpMemory[i] )
        {
            printf("Warning: Pointer changed: 0x%08X -> 0x%08X\n", arpMemory[i], pRealloc);
            arpMemory[i] = pRealloc;
        }
    }

    printf("Success!\n");

    for( int i = 0; i < dwMaxIterations; i++ )
        free( arpMemory[i] );

    return 0;
}

Приложение многократно выделяет 50 МБ памяти, а затем сразу же изменяет размер до 10 КБ. Если вы запустите его, вы обнаружите, что он завершается с ошибкой OUT OF MEMORY только после 38 итераций. Это соответствует 2 ГБ первоначально выделенной памяти - это ограничение адресного пространства для приложений Windows.

Интересно, что если вы заглянете в диспетчер задач, то увидите, что приложение почти не занимает память. Все жетаНос () терпит неудачу. Это то, что заставляет меня верить, что виртуальное адресное пространство исчерпано.

(Еще один эксперимент, который нужно попробовать, - закомментировать перераспределение, чтобы память не освобождалась и не перераспределялась. Сбой приложения происходит в одном и том же месте: после 38 итераций. Единственное отличие состоит в том, что на этот раз диспетчер задач отображает все используемые 2 ГБ.)

И последнее замечание: это же приложение работает под Linux. Так этоперераспределить () Проблема только в Windows.

есть идеи?

Ответы на вопрос(2)

Ваш ответ на вопрос