static
Variabel fungsi seumur hidup dimulai pertama kali [0] aliran program menemui deklarasi dan berakhir pada penghentian program. Ini berarti bahwa run-time harus melakukan pembukuan untuk menghancurkannya hanya jika itu benar-benar dibangun.
Selain itu, karena standar mengatakan bahwa penghancur objek statis harus berjalan dalam urutan terbalik dari penyelesaian konstruksi mereka [1] , dan urutan konstruksi dapat bergantung pada program spesifik yang dijalankan, urutan konstruksi harus diperhitungkan .
Contoh
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);
}
Keluaran:
C:> sample.exe
Dibuat di foo
Hancur di foo
C:> sample.exe 1
Dibuat jika
Dibuat di foo
Hancur di foo
Hancur di jika
C:> sample.exe 1 2
Dibuat di foo
Diciptakan jika
Dihancurkan jika
Dihancurkan di foo
[0]
Karena C ++ 98 [2] tidak memiliki referensi ke banyak utas bagaimana ini akan berperilaku dalam lingkungan multi-utas tidak ditentukan, dan dapat menjadi masalah seperti yang disebutkan Roddy .
[1]
C ++ 98 bagian 3.6.3.1
[basic.start.term]
[2]
Dalam statika C ++ 11 diinisialisasi dengan cara yang aman, ini juga dikenal sebagai Statika Sihir .