Żywotność static
zmiennych funkcyjnych rozpoczyna się po raz pierwszy [0], gdy przepływ programu napotyka deklarację i kończy się wraz z zakończeniem programu. Oznacza to, że środowisko wykonawcze musi wykonać księgowość, aby zniszczyć ją tylko wtedy, gdy została faktycznie zbudowana.
Dodatkowo, ponieważ norma mówi, że niszczyciele obiektów statycznych muszą działać w odwrotnej kolejności do zakończenia ich budowy [1] , a kolejność budowy może zależeć od konkretnego uruchomienia programu, należy wziąć pod uwagę kolejność budowy .
Przykład
struct emitter {
string str;
emitter(const string& s) : str(s) { cout << "Created " << str << endl; }
~emitter() { cout << "Destroyed " << str << endl; }
};
void foo(bool skip_first)
{
if (!skip_first)
static emitter a("in if");
static emitter b("in foo");
}
int main(int argc, char*[])
{
foo(argc != 2);
if (argc == 3)
foo(false);
}
Wynik:
C:> sample.exe
Utworzono w foo
Zniszczono w foo
C:> sample.exe 1
Utworzono w, jeśli
Utworzono w foo
Zniszczono w foo
Zniszczono w, jeśli
C:> sample.exe 1 2
Utworzono w foo
Utworzono w przypadku
zniszczenia w przypadku
zniszczenia w foo
[0]
Ponieważ C ++ 98 [2] nie ma odniesienia do wielu wątków, jak to będzie się zachowywać w środowisku wielowątkowym, jest nieokreślone i może być problematyczne, jak wspomina Roddy .
[1]
Sekcja C ++ 98 3.6.3.1
[basic.start.term]
[2]
W C ++ 11 statyka jest inicjowana w sposób bezpieczny dla wątków, jest to również znane jako Magic Statics .