Это просто оптимистично:
но для большинства ресурсов это должно автоматически выполняться ОС при выходе из процесса
Единственными ресурсами, которые ОС обрабатывает автоматически, являются "Файловые дескрипторы" и "Память" (и это может варьироваться в зависимости от ОС).
Практически все другие ресурсы (и если у кого-то есть список ресурсов, которые автоматически обрабатываются ОС I
хотелось бы, чтобы ОС была выпущена вручную.
Лучше всего избегать выхода, используя terminate (), и пытаться контролировать его, заставляя стек правильно разматываться.
Это обеспечит правильный вызов всех деструкторов и освобождение ваших ресурсов (через деструкторы).
О единственной вещи, которую я хотел бы сделать, это зарегистрировать проблему. Чтобы, когда это случилось, я мог вернуться и исправить код, чтобы это больше не повторилось. Мне нравится, что мой код прекрасно раскручивает стек для освобождения ресурсов, но некоторые считают, что некоторые люди любят внезапные остановки, когда дела идут плохо.
Мой список, когда вызывается терминат:
Обычно он вызывается, когда механизм обработки исключений не может найти обработчик для брошенного исключения. Некоторые конкретные примеры:
- Исключение ускользает от main ()
- Примечание: реализация определяется, будет ли стек разматываться здесь.
Таким образом, я всегда ловлю в main, а затем rethrow (если я не обращаюсь явно).
Таким образом, я гарантирую размотку стека (на всех платформах) и все равно получу преимущества механизма обработки исключений ОС.
- Два исключения распространяются одновременно.
- Исключение ускользает от десатруктора, пока распространяется другое исключение.
- Брошенное выражение генерирует исключение
- Исключение до или после main.
- Если исключение ускользает от конструктора / деструктора глобального объекта.
- Если исключение избегает деструктора статической переменной функции.
(т.е. будьте осторожны с конструкторами / деструкторами нелокального статического объекта)
- Исключение ускользает от функции, зарегистрированной с помощью atexit ().
- Переброс, когда в данный момент не распространяется ни одно исключение.
- Незаполненное исключение исключается из метода / функции, у которых есть список спецификаторов исключений.