Является ли использование assert () в C ++ плохой практикой?

Я склонен добавлять множество утверждений в мой код C ++, чтобы облегчить отладку без ущерба для производительности сборок релизов. Сейчас,assert является чистым макросом C, разработанным без учета механизмов C ++.

С ++, с другой стороны, определяетstd::logic_error, который должен быть брошен в случаях, когда в логике программы (отсюда и название) есть ошибка. Создание экземпляра может быть просто идеальной альтернативой C ++.assert.

Проблема в том, чтоassert а такжеabort оба сразу завершают программу, не вызывая деструкторов, поэтому пропускают очистку, тогда как создание исключения вручную добавляет ненужные затраты времени выполнения. Один из способов - создать собственный макрос утверждений.SAFE_ASSERT, который работает так же, как аналог C, но выдает исключение при сбое.

I can think of three opinions on this problem:

Stick to C's assert. Since the program is terminated immediately, it does not matter whether changes are correctly unrolled. Also, using #defines in C++ is just as bad. Throw an exception and catch it in main(). Allowing code to skip destructors in any state of the program is bad practice and must be avoided at all costs, and so are calls to terminate(). If exceptions are thrown, they must be caught. Throw an exception and let it terminate the program. An exception terminating a program is okay, and due to NDEBUG, this will never happen in a release build. Catching is unnecessary and exposes implementation details of internal code to main().

Есть ли окончательный ответ на эту проблему? Любая профессиональная рекомендация?

Edited: Пропуск деструкторов, конечно, не неопределенное поведение.

Ответы на вопрос(5)

Ваш ответ на вопрос