Это относительно старый поток, но он возник, когда я искал соображения "std :: bad_alloc" при выполнении переопределения new / delete в 2012 году.
Я бы не воспринял концепцию «ну, ничего, что вы можете сделать в любом случае» как жизнеспособный вариант.
Я лично использую в своих собственных распределениях "if (alloc ()) {} else {error / processing}", упомянутый выше. Таким образом, я могу правильно обрабатывать и, или, сообщать о каждом случае в их собственном значимом контексте.
Теперь, некоторые другие возможные решения:
1) Переопределите новый / удалить для приложения, где вы можете добавить свой собственный из нехватки памяти.
Хотя, как и в других постерах, и, в частности, без знания конкретных контекстов, основной вариант, вероятно, состоит в том, чтобы просто закрыть приложение.
Если это так, вы захотите, чтобы ваш обработчик либо предварительно выделил необходимую память, либо использовал статическую память, так что, надеюсь, сам обработчик не исчерпает себя.
Здесь вы могли бы, по крайней мере, всплыть диалоговое окно и сказать что-то вроде:
"Приложению не хватило памяти. Это фатальная ошибка, и теперь она должна завершиться самостоятельно.
Приложение должно быть запущено с минимальными требованиями к системной памяти. Отправлять отчеты об отладке в xxxx ".
Обработчик также может сохранить любую незавершенную работу и т. Д., Подгоняя приложение.
В любом случае вы не захотите использовать это для чего-то критического (например, предупреждение, любительский юмор впереди): космический челнок, монитор сердечного ритма, аппарат для диализа почек и т. Д.
Конечно, эти вещи требуют гораздо более надежных решений, использующих отказоустойчивые сейфы, методы аварийной сборки мусора, 100% тестирование / отладка / фаззинг и т. Д.
2) Как и в первом случае, установите глобальный set_new_handler () с вашим собственным обработчиком, чтобы перехватить состояние нехватки памяти в глобальной области видимости.
Может по крайней мере справиться с вещами, как упоминается в # 1.