Различные способы выхода из процесса в C ++ - PullRequest
10 голосов
/ 27 мая 2009

Есть несколько способов выхода из процесса:

например: ExitProcess, ExitThread (из основного потока), выход, отмена, возврат из основного, завершение.

Я хотел бы знать, как каждый метод влияет на статическое / глобальное / автоматическое уничтожение объектов.

Например, у меня есть проект, который аварийно завершает работу (возможно, из-за некоторой ошибки освобождения) при вызове ExitProcess, но не при вызове exit (). (относится к этому вопросу , кстати).

Так что в основном я хотел бы знать, при каких обстоятельствах происходит освобождение вышеуказанных объектов и в каком порядке (для VC ++).

Ответы [ 2 ]

14 голосов
/ 27 мая 2009

Короче говоря: Единственное, что можно сделать совершенно безопасно, это разрешить 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 - однако, насколько мне известно, никакая реализация не делает этого.)

0 голосов
/ 28 мая 2009

См. Исходный код ExitProcess () (опубликовано в compuserve, usenet)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...