Когда функция, зарегистрированная при вызове 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() и наоборот. Я уверен, что есть тонкости, но это, по-видимому, основной принцип.