Нет bad_alloc при создании двух или более std :: vector, которые вместе превышают память (MSVC) - PullRequest
0 голосов
/ 13 января 2019

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

int main() 
{
    std::size_t max_size_that_fits_memory = /*hardware-dependent value*/;

    std::vector<int> vec(max_size_that_fits_memory * 2); //OK: bad_alloc
}

max_size_that_fits_memory является аппаратно-зависимым значением, которое не выдает bad_alloc при создании экземпляра std::vector<int> vec(max_size_that_fits_memory), а выдает bad_alloc при создании экземпляра std::vector<int> vec(max_size_that_fits_memory * 2). Приведенный выше код приводит к bad_alloc, как и ожидалось, но

int main() 
{
    std::size_t max_size_that_fits_memory = /*...*/;

    std::vector<int> vec1(max_size_that_fits_memory); //Ok...
    std::vector<int> vec2(max_size_that_fits_memory); //Strange, no exception thrown
}

этот кусок вместо этого не выбрасывает bad_alloc. Такое же поведение будет, если я построю гораздо больше векторов такого размера:

int main() 
{
    std::size_t max_size_that_fits_memory = /*...*/;

    std::vector<int> vec1(max_size_that_fits_memory);
    std::vector<int> vec2(max_size_that_fits_memory);
    //...
    std::vector<int> vecN(max_size_that_fits_memory);
}

Как это возможно?

1 Ответ

0 голосов
/ 13 января 2019

Важная вещь с vector заключается в том, что она требует выделения памяти в непрерывном блоке . Типичная ситуация - когда общего объема свободной памяти достаточно, но нет непрерывного доступного блока. Например, здесь можно выделить несколько блоков из 3-х ячеек, но не один блок из 6-ти ячеек:

█░░░░░█░░░░█░░░██░░░░░█░░░░█░░░█

...