Я обнаружил странную несогласованность при создании двух векторов, которые вместе превышают объем памяти системы (как физической, так и виртуальной):
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);
}
Как это возможно?