Почему иногда делает мою программу segfault когда из памяти вместо того, чтобы бросить станд.:: bad_alloc?

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

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

Почему иногда делает мою программу segfault когда из памяти, вместо того, чтобы сообщить о необработанном станд.:: bad_alloc и завершение?

11
задан Brad Larsen 2 April 2010 в 16:07
поделиться

3 ответа

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

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

8
ответ дан 3 December 2019 в 10:25
поделиться

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

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

1
ответ дан 3 December 2019 в 10:25
поделиться

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

0
ответ дан 3 December 2019 в 10:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: