Почему моя программа иногда возникает из-за нехватки памяти, а не бросает std:: bad_alloc?

У меня есть программа, которая реализует несколько алгоритмов эвристического поиска и несколько доменов, предназначенных для экспериментальной оценки различных алгоритмов. Программа написана на С++, построена с использованием инструментальной привязки GNU и запущена в 64-битной системе Ubuntu. Когда я запускаю свои эксперименты, я использую команду bash ulimit, чтобы ограничить объем виртуальной памяти, которую может использовать процесс, чтобы моя тестовая система не начинала заменять.

Некоторые комбинации экземпляров алгоритма/теста попадают в ограничение памяти, которое я определил. В большинстве случаев программа выдает исключение std:: bad_alloc, которое печатается обработчиком по умолчанию, после чего программа завершается. Иногда, вместо этого, программа просто отключается.

Почему моя программа иногда возникает из-за нехватки памяти, вместо сообщения о необработанном std:: bad_alloc и завершении?

Ответ 1

Одна из причин может заключаться в том, что по умолчанию Linux переопределяет память. Запрос памяти из ядра, похоже, работает нормально, но позже, когда вы на самом деле начнете использовать память, ядро ​​замечает "О, дерьмо, у меня заканчивается память", вызывается убийца из памяти (OOM), который выбирает некоторые жертвы и убивает его.

Описание этого поведения см. в http://lwn.net/Articles/104185/

Ответ 2

Что сказал janneb. Фактически Linux по умолчанию никогда не выбрасывает std:: bad_alloc (или возвращает NULL из malloc()).

Ответ 3

Это может быть какой-то код, использующий no-throw new и не проверяющий возвращаемое значение.

Или какой-то код может ловить исключение, а не обрабатывать его или перестраивать.