Когда целесообразно использовать исключения C++?
Я пытаюсь создать класс, который должен динамически выделять часть памяти..
Я планировал выделить память, которая ей нужна во время создания, но как мне справиться с неудачным выделением памяти? Должен ли я бросить исключение? Я где-то читал, что исключения должны использоваться только для "исключительных" случаев, и нехватка памяти не кажется мне исключительным случаем…
Стоит ли вместо этого выделять память в отдельной процедуре инициализации и проверять наличие сбоев, а затем грациозно уничтожать экземпляр класса?
Или я должен использовать исключения вместо этого? Класс не будет ничего полезного, если эти выделения памяти потерпят неудачу..
РЕДАКТИРОВАТЬ: консенсус, кажется, что нехватка памяти является исключительным случаем.
Посмотрим, как это сделать.. Спасибо..:)
3 ответа
Предполагая, что вы используете new для выделения памяти и не переопределяете new
оператор, он автоматически бросит std::bad_alloc
исключение, если не удается правильно выделить память.
Я где-то читал, что исключения должны использоваться только для "исключительных" случаев, и нехватка памяти не кажется мне исключительным случаем…
Недостаток памяти кажется мне довольно исключительным случаем:)
С такой ситуацией очень трудно справиться. Возможно, вы захотите вернуть значимую ошибку пользователю вашего приложения, но если это проблема, вызванная нехваткой памяти, вы можете даже не позволить себе выделить память для сообщения об ошибке. Это немного сложная ситуация на самом деле.
Существует метод защитного программирования (иногда называемый "парашютом памяти" или "фондом дождливого дня"), при котором вы выделяете часть памяти при запуске приложения. Когда вы потом обрабатываете bad_alloc
исключение: вы освобождаете эту память и используете доступную память, чтобы корректно закрыть приложение, включая отображение значимой ошибки для пользователя. Это намного лучше, чем разбиться:)
Я бы сказал, что нехватка памяти (в частности, кучи памяти) является исключительным случаем, и если ваш класс - и, более того, ваше приложение - не может продолжаться, я думаю, что исключение / обработка исключений - это очень подходящий и изящный подход.
Обычное поведение в C++, когда у вас недостаточно памяти, - генерировать исключение. Встроенный new
Оператор делает это по умолчанию.