обработка сбоев при получении ресурсов

После многих лет программирования у меня не было ситуации, когда разумный malloc или new потерпели бы неудачу (возможно, потому, что мои malloc действительно разумны), хотя я всегда проверяю это.

В моем случае приложения должны изящно (надеюсь) закрываться с соответствующей записью в журнале. Что бы вы сделали в этом случае? Интересно услышать ваш подход - вы ждете ресурсов или закрываете магазин?


person Ulterior    schedule 09.07.2011    source источник
comment
Это будет полностью зависеть от приложения, не так ли? И как только вы определились со своим вариантом использования, соответствующий механизм должен быть очевиден. Мне кажется, что это какой-то бессмысленный опрос...   -  person Lightness Races in Orbit    schedule 10.07.2011
comment
Должен согласиться - это звучит как субъективный опрос, и даже не для языка C или C++.   -  person Puppy    schedule 10.07.2011
comment
Я хотел бы знать, как люди думают в таких ситуациях. Да, C, C++ только потому, что я программирую на нем.   -  person Ulterior    schedule 10.07.2011
comment
comment
@delnan да, спасибо, можно пометить как клон   -  person Ulterior    schedule 10.07.2011


Ответы (2)


Вы практически ничего не можете сделать, если динамическое выделение не работает — почти нет операций, написанных для обработки этой ситуации. Если это не удается, просто дайте приложению сбой.

person Puppy    schedule 09.07.2011
comment
с посланием в бутылке и капитан уходит последним или просто крах? - person Ulterior; 10.07.2011
comment
@ user757808: Как вы можете оставить сообщение в бутылке, если вы не можете выделить бутылку? Ваши библиотеки ввода-вывода не будут и, возможно, для данной платформы не могут быть спроектированы для работы без динамического распределения. - person Puppy; 10.07.2011
comment
@DeadMG - Может быть, посмотреть на дамп ядра? - person KevinDTimm; 15.05.2012
comment
Это подделка. Даже если небольшое выделение не удается, вы должны попытаться выйти корректно; есть вероятность, что раскручивание стека освободит достаточно ресурсов для библиотеки ввода-вывода для вывода сообщения об ошибке, как предлагает @Raedwald. - person Fred Foo; 15.05.2012

Обычно моя программа закрывается настолько изящно, насколько это возможно, с простой записью сообщения об ошибке. В C++ я делаю это, используя catch вместо std::bad_alloc в main(). К моменту выполнения catch деструкторы, вызываемые раскручиванием стека, должны были освободить часть памяти, поэтому вероятность сбоя самого ведения журнала меньше. Я избегаю выделения памяти (например, используя char * строк вместо std::string строк) в этом коде ведения журнала, чтобы еще больше снизить вероятность сбоя ведения журнала.

person Raedwald    schedule 10.01.2012