Возможный дубликат:
Вызывает ли C ++ деструкторы для глобальных и классовых статических переменных?
Какова продолжительность жизни
MyClass myclass;
static MyClass myclass;
const MyClass myclass;
static const MyClass myclass;
static MyClass myclass;
когда его инициализация фактически произошлаstatic constexpr MyClass myclass;
в C ++ 11и особенно будут ли они уничтожены по окончании обычной программы (Т.е. main
осталось без ошибки)? Где стандарт так утверждает.
Я заметил, что частный деструктор предотвращает создание всех этих переменных. Но если я правильно помню, где-то было явно упомянуто, что некоторые статические данные уже могут быть помещены в секцию статических данных и загружены предварительно созданными. Это будет означать для меня, что не будет называться деструктор. И это подразумевает, что мне разрешено определять такую переменную …
Деструкторы объектов области файла или пространства имен вызываются при выходе из потока управления main()
,
Если исключение выходит main()
затем его реализация определяет, будут ли вызваны деструкторы каких-либо объектов. В современных компиляторах деструкторы в этом случае не будут вызываться, чтобы можно было легко проверить состояние программы при возникновении необработанного исключения. Ранние реализации C ++ использовали механизм исключений, основанный на setjmp
/longjmp
которая разматывает стек при поиске обработчика исключений и, следовательно, вызывает деструкторы, даже если подходящий обработчик исключений в конечном итоге не найден.
Если приложение заканчивается _exit()
или же _Exit()
или же std::quick_exit()
никаких деструкторов не вызывают.
Деструкторы для объектов со статическим временем жизни (во всех случаях вы
упомянуть, определить объекты со статическим временем жизни — хотя я не думаю,
что объект в constexpr
может иметь нетривиальный деструктор)
вызывается изнутри exit()
в обратном порядке объекты были
построен.
Возвращаясь из main
причины exit
быть вызванным с возвращаемым значением,
поэтому возвращение из main приведет к вызову этих деструкторов. Другой
средства завершения программы (abort()
, провал утверждения, _exit()
,
и т.д.) не буду называть деструкторами.
Если объекты находятся в DLL (.so
под Unix), деструкторы будут
обычно вызывается, когда DLL выгружена.