У меня есть программа, которая реализует несколько эвристических алгоритмов поиска и несколько доменов, разработанных для экспериментальной оценки различных алгоритмов. Программа записана в C++, создала использование набора инструментальных средств GNU и работала на 64-разрядной системе Ubuntu. Когда я выполняю свои эксперименты, я использую удар ulimit
управляйте для ограничения объема виртуальной памяти, которую может использовать процесс, так, чтобы моя система тестирования не начинала подкачивать.
Определенные комбинации экземпляра алгоритма/теста поражают предел памяти, который я определил. Большую часть времени программа бросает станд.:: исключение bad_alloc, которое печатается обработчиком по умолчанию, в которой точке завершается программа. Иногда, а не этот случай, программа просто segfaults.
Почему иногда делает мою программу segfault когда из памяти, вместо того, чтобы сообщить о необработанном станд.:: bad_alloc и завершение?
Одна из причин может заключаться в том, что по умолчанию Linux чрезмерно использует память. Запрос памяти у ядра, похоже, работает нормально, но позже, когда вы действительно начинаете использовать память, ядро замечает «О, черт, у меня заканчивается память», вызывает убийцу нехватки памяти (OOM), который выбирает некоторые процесс жертвы и убивает его.
Описание этого поведения см. В http://lwn.net/Articles/104185/
Это может быть какой-то код, в котором используется no-throw new и не проверяется возвращаемое значение.
Или какой-то код мог перехватить исключение, но не обработать его или повторно выбросить.
Что сказал Яннеб. Фактически Linux по умолчанию никогда никогда не выбрасывает std :: bad_alloc (или возвращает NULL из malloc ()).