Я согласен, что подход RAII является благоприятным.
Однако, предупреждающее слово: atExit, смешанный с dll и дескрипторами, разбит на окнах. К сожалению, это также влияет на RAII, поскольку это реализуется с помощью обработчиков atExit в среде выполнения c ++.
Порядок вызова обработчиков atexit в windows:
- где-то вызывается выход или main () выходит за рамки
- atexit обработчики, определенные в процессе, называются.
- все ручки уничтожены.
- Вызываются обработчики atexit, определенные в dll.
Неважно, регистрируются ли обработчики atexit в dll до того, как обработчики в процессе сначала вызываются обработчики процесса, а дескрипторы уничтожаются до вызова обработчиков dll. Это приводит к исключениям win32, когда вызывается код очистки, поскольку все дескрипторы, принадлежащие dll, больше не действительны.
Это код эффекта, который содержит дескрипторы потоков, мьютексов, файлов, сокетов и т. Д. Если они размещены в dll, то их необходимо очистить перед вызовом exit или нет вообще.
Кстати, я не против окна, если я ошибаюсь или кто-то знает что-то об этом, я хотел бы знать, так как это причиняет мне невыразимую боль при очистке приложения. Я понял, что это отладка обработки выхода во время выполнения c ++ после получения исключений win32 при выходе из приложений.
Мне пришлось удалить все вызовы, чтобы выйти из моего кода. Теперь я убедился, что никакие статические данные в dll не управляют дескриптором. Все статические дескрипторы управляются объектами, которые разрушаются, когда main выходит из области видимости.