Когда целесообразно использовать исключения C ++? - PullRequest
3 голосов
/ 25 февраля 2009

Я пытаюсь создать класс, который должен динамически выделять часть памяти ..

Я планировал выделить память, которая ей нужна во время строительства, но как мне справиться с неудачным выделением памяти? Должен ли я бросить исключение? Я где-то читал, что исключения должны использоваться только для «исключительных» случаев, и нехватка памяти не кажется мне исключительным случаем ..

Стоит ли вместо этого выделять память в отдельной процедуре инициализации, проверять наличие сбоев и затем грациозно уничтожать экземпляр класса?

Или я должен вместо этого использовать исключения? Класс не будет ничего полезного, если эти выделения памяти потерпят неудачу ..


РЕДАКТИРОВАТЬ: консенсус кажется, что нехватка памяти является исключительным случаем.

Посмотрим, как это сделать .. Спасибо ..:)

Ответы [ 3 ]

15 голосов
/ 25 февраля 2009

Если вы используете new для выделения памяти и не переопределяете оператор new, он автоматически выдаст исключение std::bad_alloc, если не удастся правильно выделить память.

Я где-то читал, что исключения следует использовать только для «исключительных» случаи, и не хватает памяти не похоже на исключительный случай для меня ..

Исчезновение памяти кажется мне довольно исключительным случаем:)

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

Существует метод защитного программирования (иногда называемый «парашютом памяти» или «фондом дождливого дня»), при котором вы выделяете часть памяти при запуске приложения. Затем, когда вы обрабатываете исключение bad_alloc, вы освобождаете эту память и используете доступную память, чтобы изящно закрыть приложение, включая отображение значимой ошибки для пользователя. Это намного лучше, чем сбой:)

3 голосов
/ 25 февраля 2009

Я бы сказал, что нехватка памяти (особенно динамической памяти) является исключительным случаем, и если ваш класс - и, более того, ваше приложение - не может продолжаться, я думаю, что выброс / обработка исключений - это очень подходящий и изящный подход. 1001 *

1 голос
/ 25 февраля 2009

Обычное поведение в C ++, когда у вас недостаточно памяти, - это исключение Встроенный оператор new делает это по умолчанию.

...