Почему моя программа иногда вызывает segfault, когда не хватает памяти, а не выбрасывает std :: bad_alloc? - PullRequest
11 голосов
/ 02 апреля 2010

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

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

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

Ответы [ 3 ]

8 голосов
/ 02 апреля 2010

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

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

1 голос
/ 02 апреля 2010

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

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

1 голос
/ 02 апреля 2010

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

...