Статические переменные в c++
Любая статическая переменная инициализурется нулём, ну, или, нулями, если явно не указать инициализируещее знание.
Но, это не совсем правда :)
Вы можете изменить её значение инициализации:
int main() { static int v1; static int v2 = 3; std::cout << v1 << std::endl;// will print 0 std::cout << v2 << std::endl;// will print 3 }
Пользовательская инициализация локальных статических переменных до c++11 не являются потокобезопасной.
Данный код до с++11 не корректен.
void func() { static int v = 1; // data rice before c++11! v++; std::cout << v << std::endl; } std::thread th1(func); std::thread th2(func); th1.join(); th2.join();
Так можно делать начиная с с++11 стандарта.
Время жизни статических объектов длится до завершения функции main и exit.
Вызов их деструкторов происходит в обратном порядке их конструирования:
struct T0 { T0() { std::cout << "T0" << std::endl; } ~T0() { std::cout << "~T0" << std::endl; } }; struct T1 { T1() { std::cout << "T1" << std::endl; } ~T1() { std::cout << "~T1" << std::endl; } }; int main(int argc, char *argv[]) { std::cout << "enter to main" << std::endl; { static T1 t1; static T0 t0 = T0{}; } std::cout << "leave from scope" << std::endl; }
Вывод:
enter to main T1 T0 leave from scope ~T0 ~T1