C++ 関数の静的変数の有効期間はどのくらいですか? 質問する

C++ 関数の静的変数の有効期間はどのくらいですか? 質問する

変数がstatic関数のスコープ内で宣言されている場合、その変数は一度だけ初期化され、関数呼び出し間でその値が保持されます。その有効期間は正確にはどれくらいですか? コンストラクターとデストラクターはいつ呼び出されますか?

void foo() 
{ 
    static string plonk = "When will I die?";
}

ベストアンサー1

関数変数の有効期間は、プログラムフローが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 [2]には複数のスレッドに関する記述がないため、マルチスレッド環境でこれがどのように動作するかは未定義であり、次のような問題が生じる可能性がある。ロディ言及します。

[1] C++98セクション3.6.3.1 [basic.start.term]

[2]C++11では静的変数はスレッドセーフな方法で初期化されます。これは魔法の静力学

おすすめ記事