Когда обработчик завершения C ++ является правильным (TM)?

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

Я читал, что он может использоваться для обеспечения освобождения ресурсов, но для большинства ресурсов это должно автоматически выполняться ОС при выходе из процесса (например, файловые дескрипторы). Теоретически я вижу случай, если, скажем, вам нужно было отправить серверу конкретное сообщение при выходе из-за сбоя. Но большую часть времени обработка ОС должна быть достаточной.

Когда используется обработчик завершения The Right Thing (TM)?

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

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

Martin York's ответо единственном, что я делаю в пользовательском обработчике завершения, это регистрирую проблему, чтобы я мог идентифицировать и исправить код, вызывающий сбой. Это единственный случай, когда я обнаружил, что использование собственного обработчика завершенияRight Thing.

Так как это определяется реализацией независимо от того, будет ли стек разматываться раньшеstd::terminate() называется, я иногдадобавить код для генерации обратной трассировки чтобы найти неисследованное исключение1.

1) This seems to work for me when using GCC on Linux platforms.

but for the majority of resources this should be handled automatically by the OS when the process exits

Единственными ресурсами, которые ОС обрабатывает автоматически, являются & quot; Файловые дескрипторы & quot; и "Память" (И это может варьироваться в зависимости от ОС). Практически все другие ресурсы (и если у кого-то есть список ресурсов, которые автоматически обрабатываются операционной системой I хотел бы это) должны быть вручную выпущены ОС.

Лучше всего избегать выхода с помощью terminate () и пытаться отключить его, заставляя стек правильно разматываться. Это обеспечит правильный вызов всех деструкторов и освобождение ваших ресурсов (через деструкторы).

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

My list of when terminate is called:

Обычно он вызывается, когда механизм обработки исключений не может найти обработчик для брошенного исключения. Некоторые конкретные примеры:

An exception escapes main() Note: It is implementation defined whether the stack is unwound here. Thus I always catch in main and then rethrow (if I do not explicitly handle). That way I guarantee unwinding of the stack (across all platforms) and still get the benefits of the OS exception handling mechanism. Two exceptions propagating simultaneously. An exception escapes a desatructor while another exception is propagating. The expression being thrown generates an exception An exception before or after main. If an exception escapes the constructor/destructor of a global object. If an exception escapes the destructor of a function static variable. (ie be careful with constructors/destructors of nonlocal static object) An exception escapes a function registered with atexit(). A rethrow when no exception is currently propagating. An unlisted exception escapes a method/function that has exception specifier list. via unexpected.

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

ВАШ ОТВЕТ НА ВОПРОС