Будут ли (глобальные) статические переменные уничтожены в конце программы?

Возможный дубликат:
Вызывает ли C ++ деструкторы для глобальных и классовых статических переменных?

Какова продолжительность жизни

  • Глобальный MyClass myclass;
  • Глобальный static MyClass myclass;
  • Глобальный const MyClass myclass;
  • Глобальный static const MyClass myclass;
  • функция локальная static MyClass myclass; когда его инициализация фактически произошла
  • Глобальный static constexpr MyClass myclass; в C ++ 11

и особенно будут ли они уничтожены по окончании обычной программы (Т.е. main осталось без ошибки)? Где стандарт так утверждает.

Я заметил, что частный деструктор предотвращает создание всех этих переменных. Но если я правильно помню, где-то было явно упомянуто, что некоторые статические данные уже могут быть помещены в секцию статических данных и загружены предварительно созданными. Это будет означать для меня, что не будет называться деструктор. И это подразумевает, что мне разрешено определять такую ​​переменную …

1

Решение

Деструкторы объектов области файла или пространства имен вызываются при выходе из потока управления main(),

Если исключение выходит main() затем его реализация определяет, будут ли вызваны деструкторы каких-либо объектов. В современных компиляторах деструкторы в этом случае не будут вызываться, чтобы можно было легко проверить состояние программы при возникновении необработанного исключения. Ранние реализации C ++ использовали механизм исключений, основанный на setjmp/longjmp которая разматывает стек при поиске обработчика исключений и, следовательно, вызывает деструкторы, даже если подходящий обработчик исключений в конечном итоге не найден.

Если приложение заканчивается _exit() или же _Exit() или же std::quick_exit() никаких деструкторов не вызывают.

4

Другие решения

Деструкторы для объектов со статическим временем жизни (во всех случаях вы
упомянуть, определить объекты со статическим временем жизни — хотя я не думаю,
что объект в constexpr может иметь нетривиальный деструктор)
вызывается изнутри exit()в обратном порядке объекты были
построен.

Возвращаясь из main причины exit быть вызванным с возвращаемым значением,
поэтому возвращение из main приведет к вызову этих деструкторов. Другой
средства завершения программы (abort(), провал утверждения, _exit(),
и т.д.) не буду называть деструкторами.

Если объекты находятся в DLL (.so под Unix), деструкторы будут
обычно вызывается, когда DLL выгружена.

6

По вопросам рекламы [email protected]