C++ 函数中静态变量的生命周期是多少?
如果一个变量被声明为static
一个函数的作用域,它只被初始化一次并且在函数调用之间保持它的值。它的寿命究竟是多少?什么时候调用它的构造函数和析构函数?
void foo()
{
static string plonk = "When will I die?";
}
-
函数
static
变量的生命周期从[0]程序流第一次遇到声明时开始,并在程序终止时结束。这意味着运行时必须执行一些记录,以便只有在实际构建时才将其销毁。此外,由于标准规定静态对象的析构函数必须按照其构造完成的相反顺序运行[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
销毁于 ifC:>sample.exe 1 2
Created in foo
Created in if
Destroyed in if
Destroyed in foo[0]
由于 C++98
[2]没有提到多线程,因此未指定在多线程环境中的行为方式,并且正如Roddy所提到的那样可能会出现问题。[1]
C++98 部分3.6.3.1
[basic.start.term][2]
在 C++11 中,静态以线程安全的方式初始化,这也称为 Magic
Statics 。