2016-12-22 3 views
3

とstatic変数の初期化は、プロジェクトでは、私は、コードレビュープロセスにおける以下のようなコードを見働いています:非静的メンバ変数

class A 
{ 
    shared_ptr<B> instanceB; 
} 

A::A() 
{ 
    instanceB = make_shared<B>(); 
    static C localVariable(instanceB.get()); 
} 

を私は静的変数のを知っているが、グローバルのようなもので、プログラムの起動時に作成され、 instanceBはAがインスタンス化されたときに作成されます。そして、これはクラッシュする可能性があります。

私はinstanceB.get()が返す値について考え始めたと説明しながら説明します。おそらくごみの権利でしょうか?そして、私はそれについてもっと考えると 私はこのコードは、なぜ静的変数は、彼らのctorsで非静的なパラメータを取ることが許可されてコンパイルすべきではないと思いますか?

答えて

8

とプログラムが

を開始するといいえ、それは間違って作成されます。関数内の静的変数は、その関数が初めて実行されるときに作成されます。したがって、初めてA::A()を実行すると、localVariableにはinstanceB.get()が返すものが届きます。だから、ごみはlocalVariableにはありません。

このようなデザインは実際には非常に奇妙に見えるかもしれませんが、構文的には正しく、コンパイラにとっては明確な意味があります。さらに、古典的なシングルトンの実装では、非常に似通った設計が使用されています。

関連する問題