Die Lebensdauer der Funktion static
Variablen beginnt das erste Mal [0] der Programmablauf trifft auf die Deklaration und endet bei Programmende. Das bedeutet, dass die Laufzeit eine Buchführung durchführen muss, um sie nur dann zu zerstören, wenn sie tatsächlich konstruiert wurde.
Da der Standard außerdem besagt, dass die Destruktoren statischer Objekte in der umgekehrten Reihenfolge der Fertigstellung ihrer Konstruktion ablaufen müssen [1] Da die Reihenfolge des Aufbaus vom jeweiligen Programmablauf abhängen kann, muss die Reihenfolge des Aufbaus berücksichtigt werden.
Beispiel
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);
}
Sortie :
C:>Muster.exe
Erstellt in foo
Zerstört in foo
C:>Muster.exe 1
Erstellt in if
Erstellt in foo
Zerstört in foo
Zerstört in wenn
C:>Muster.exe 1 2
Erstellt in foo
Erstellt in if
Zerstört in wenn
Zerstört in foo
[0]
Seit C++98 [2] hat keinen Verweis auf mehrere Threads, wie sich dies in einer Multi-Thread-Umgebung verhalten wird, ist nicht spezifiziert und kann problematisch sein, da Roddy Erwähnungen.
[1]
C++98 Abschnitt 3.6.3.1
[basic.start.term]
[2]
In C++11 werden Statiken auf eine thread-sichere Weise initialisiert, dies ist auch bekannt als Magische Statik .