all

C++ 函数中静态变量的生命周期是多少?

发布于 2022-03-22 22:38:37

如果一个变量被声明为static一个函数的作用域,它只被初始化一次并且在函数调用之间保持它的值。它的寿命究竟是多少?什么时候调用它的构造函数和析构函数?

void foo() 
{ 
    static string plonk = "When will I die?";
}
关注者
0
被浏览
33
1 个回答
  • 面试哥
    面试哥 2022-03-22
    为面试而生,有面试问题,就找面试哥。

    函数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
    销毁于 if

    C:>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



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看