Короче говоря: Единственное, что можно сделать совершенно безопасно, это разрешить main()
или вашей функции потока return
.
Стандарт C ++ гарантирует (3.6.3 / 1, 18.3), что деструкторы для глобальных объектов (включая статические объекты) будут вызываться, если вызывается exit()
, однако в нем прямо указывается, что деструкторы для local переменные не будут вызваны в этом случае. exit()
вызовет все функции, зарегистрированные с помощью atexit()
, а также сбросит, а затем закроет все открытые потоки stdio (включая, по крайней мере, stdin
, stdout
, stderr
).
Вызов abort()
гарантированно не вызовет локальные или глобальные деструкторы. Он также не будет вызывать функции, зарегистрированные в atexit()
, или сбрасывать потоки stdio.
Вызов любого примитива Win32, такого как ExitProcess()
или ExitThread()
, безусловно, не вызовет деструкторы для локальных переменных и почти наверняка не вызовет никаких деструкторов для глобальных объектов или любых функций, зарегистрированных в atexit()
. Не рекомендуется вызывать эти функции непосредственно в программе на C ++ - в основном, эти функции Win32 и библиотека времени выполнения C ++ ничего не знают друг о друге. Фактически, даже в документации MSDN для ExitThread()
рекомендуется, чтобы программы на C ++ возвращались из функции потока вместо вызова ExitThread()
.
(Теоретически возможно, что библиотека времени выполнения специально организовала для ExitProcess()
вызов глобальных деструкторов объектов - это можно сделать, всегда загружая определенную DLL, функция точки входа которой будет выполнять эти вызовы, так как ExitProcess()
будет вызовите функцию точки входа для каждой загруженной DLL с DLL_PROCESS_DETACH
- однако, насколько мне известно, никакая реализация не делает этого.)