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 。
-
Android中静态变量的生命周期
2021-01-30 关注 0 浏览101 1答案
-
ASP.NET静态变量的生命周期
2021-02-02 关注 0 浏览110 1答案
-
C 和 C++ 中的静态变量存储在哪里?
2022-07-28 关注 0 浏览12 1答案
-
成员函数中的静态变量
2022-07-28 关注 0 浏览14 1答案
-
Python C API中的静态变量
2021-01-29 关注 0 浏览88 1答案
-
静态变量与非静态变量
2021-01-30 关注 0 浏览116 1答案
-
Java中静态变量与最终静态变量之间的区别
2021-01-30 关注 0 浏览88 1答案
-
公共静态变量和私有静态变量之间的区别
2021-01-30 关注 0 浏览79 1答案
-
函数中静态变量的 Python 等价物是什么?
2022-03-22 关注 0 浏览19 1答案
-
何时在C#中初始化静态变量?
2021-02-02 关注 0 浏览616 1答案