Ошибка приложения C ++ - PullRequest
0 голосов
/ 04 июля 2018

У меня есть фрагмент кода, в котором я динамически создаю несколько относительно больших объектов (14 МБ) и заполняю ими вектор (размером 260). Я получаю неверное исключение alloc, которое я ловлю. Приложение все еще можно использовать после моего первого выброса, а затем, когда я перезапущу его, исключение недопустимого выделения выдается еще раз, но приложение больше не может быть использовано. Знаете ли вы, есть ли способ сохранить его работоспособным даже после того, как сгенерировано исключение (независимо от того, сколько раз оно было сгенерировано).

Спасибо

1 Ответ

0 голосов
/ 04 июля 2018

Теперь для массива из 260 объектов размером 14 МБ потребуется около 4 ГБ ОЗУ. И хитрость в том, что это должен быть сплошной блок. Поэтому он может быть недоступен из-за фрагментации памяти, даже если объем свободной оперативной памяти достаточен. Вы должны попробовать использовать несмежный контейнер, такой как std::list или std::vector<std::unique_ptr<obj_t>>. Приложение может использоваться независимо от того, сколько раз генерируются исключения (при условии, что они были перехвачены). А с большей степенью детализации распределения вероятность того, что память не будет выделяться, будет меньше.

...