Я хочу знать, вызываются ли функции, зарегистрированные в atexit()
до или после уничтожения глобальных переменных. Указано ли это стандартом или реализацией?
Когда функция, зарегистрированная при вызове atexit()
Ответ 1
Он четко определен и зависит от того, был ли объект, о котором идет речь, был создан до или после регистрации функции с помощью atexit()
:
3.6.3 Прекращение действия
3. Если завершение инициализации объекта со статической продолжительностью хранения секвенируется перед вызовом
std::atexit
(см.<cstdlib>
, 18.5), вызов функции, переданной вstd::atexit
секвенируется перед вызовом деструктора для объекта. Если вызовstd::atexit
секвенирован до завершения инициализации объекта со статической продолжительностью хранения, вызов деструктора для объекта секвенируется перед вызовом функции, переданной вstd::atexit
. Если вызовstd::atexit
секвенирован перед другим вызовомstd::atexit
, вызов функции, переданной второму вызовуstd::atexit
, секвенирован перед вызовом функции, переданной первому вызовуstd::atexit
.
Моя непрофессиональная интерпретация выше всего того, что материал, который был создан до того, как вы вызвали atexit(handler)
, уничтожается после вызова handler()
и наоборот. Я уверен, что есть тонкости, но это, по-видимому, основной принцип.