Время жизни глобальных статических данных соответствует времени жизни приложения. Однако при нормальном завершении работы деструкторы будут работать .
Проблема в том, что порядок, в котором происходит инициализация / уничтожение, не всегда детерминирован и, конечно, не переносим (т.е. зависит от платформы и, например, компоновщиков времени выполнения).
Наихудшая ситуация с разделяемым объектом (динамическое связывание). Некоторые платформы позволяют использовать флаги компоновщика для указания «приоритетов» для общих объектов (чтобы можно было влиять на статический порядок инициализации); Другие платформы (например, AIX gcc, HP / UX) требуют специальных атрибутов компилятора, чтобы пометить статические процедуры как «процедуры инициализации dll».
Короче говоря: не зависят от статических данных, кроме как через функции доступа. Функция доступа может выглядеть так:
static int _myinternalvar = 3;
static int GetMyInternalVar()
{
return _myinternalvar;
}
таким образом, вы будете точно знать, , что статический объект был инициализирован до выполнения функции. Если метод доступа является единственной функцией, которая может получить доступ к данным, вы можете объявить статическое в своей области (добавление инкапсуляции).