C++函数中的静态变量的生命周期是多长?
C++函数中的静态变量的生命周期是多长?
如果在函数范围内声明一个变量为 static
,它只会被初始化一次并在函数调用之间保留其值。它的生命周期是什么时候?它的构造函数和析构函数何时被调用?
void foo() { static string plonk = "When will I die?"; }
admin 更改状态以发布 2023年5月20日
static
变量的生命周期始于程序执行时首次遇到声明的位置,并在程序终止时结束。这意味着运行时必须进行一些簿记,以便只在实际构造时才进行析构。
此外,由于标准规定静态对象的析构函数必须按照它们构造完成的相反顺序运行[1],而构造顺序可能取决于特定的程序运行,所以必须考虑构造顺序。
示例
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); }
输出:
C:>sample.exe
在foo中创建
在foo中销毁C:>sample.exe 1
在if语句中创建
在foo中创建
在foo中销毁
在if语句中销毁C:>sample.exe 1 2
在foo中创建
在if语句中创建
在if语句中销毁
在foo中销毁
[0]
由于C++98没有涉及多线程的引用,因此无法确定其在多线程环境下的行为,可能会出现问题,如Roddy所述。
[1]
在C++98中,在代码段3.6.3.1
[basic.start.term]有规定。
[2]
在C++11中,静态变量以线程安全的方式进行初始化,这也被称为Magic Statics。