Я обычно добавляю множество утверждений в свой код на С++, чтобы упростить отладку, не влияя на производительность выпусков. Теперь assert
- это чистый макрос C, созданный без использования механизмов С++.
C++, с другой стороны, определяет std::logic_error
, который должен быть брошен в случаях, когда в логике программы есть ошибка (отсюда и название). Выброс экземпляра может быть просто идеальной, более альтернативной версии С++ для assert
.
Проблема заключается в том, что assert
и abort
обе завершают программу немедленно, не вызывая деструкторы, поэтому пропускают очистку, в то время как выброс исключения вручную добавляет ненужные затраты времени выполнения. Один из способов создания собственного макроса подтверждения SAFE_ASSERT
, который работает так же, как и C-копия, но генерирует исключение при ошибке.
Я могу представить три мнения по этой проблеме:
- Придерживайтесь утверждения C. Поскольку программа немедленно прекращается, не имеет значения, правильно ли развернуты изменения. Кроме того, использование
#define
в С++ так же плохо. - Выбросьте исключение и поймайте его в main(). Предоставление кода для пропуска деструкторов в любом состоянии программы является плохой практикой, и его следует избегать любой ценой, а также вызовы terminate(). Если выбрасываются исключения, они должны быть пойманы.
- Выбросить исключение и завершить его. Исключение, заканчивающееся программой, в порядке, и из-за
NDEBUG
этого никогда не произойдет в сборке релиза. Ловушка не нужна и предоставляет детали реализации внутреннего кодаmain()
.
Есть ли окончательный ответ на эту проблему? Любая профессиональная ссылка?
Отредактировано: Пропуск деструкторов - это, конечно, поведение undefined.