使用

2016-11-10 13 views
0

Iが含まiostreamヘッダと「)(主空」をに周りgodbolt.orgを再生し、そしていくつかの"extra code"と、コンパイラによって追加気づきました。使用

は基準に見た後、私はそれらを構造に必要とされている考え出し、彼らは既に初期化/構築されていない場合は、オブジェクトcincoutcerrclogwcinwcoutwcerr、およびwclog,を初期化します。

N4606:§27.5.3.1.6

27.5.3.1.6 Class ios_base::Init [ios::Init] 

namespace std { 
    class ios_base::Init { 
     public: 
     Init(); 
     ~Init(); 
     private: 
     static int init_cnt; // exposition only 
    }; 
} 

しかしstaticデータのすべてが標準では、それがclass Initのコンストラクタとデストラクタ呼び出しの数をカウントし、に初期化されると言いますゼロ。説明の便宜上

2、保持データはここに提示 ようにされている:(2.1) - 静的INT init_cnt、コンストラクタの数およびゼロに初期化クラスの初期化のため デストラクタ呼び出しをカウントします。

ここではstatic int init_cnt;の使用は何ですか? なぜコンストラクタ/デストラクタが呼び出された回数を数える必要がありますか?

+1

最後の破棄(cppreferenceから)でのみフラッシュされるように見えます:*クラスは、最初のインスタンスが構築され、出力をフラッシュするときに、C++ストリームのインスタンス数を追跡して初期化します最後のインスタンスが破棄されたときのストリーム* – NathanOliver

+0

https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counterでその一部が説明されています – jcoder

答えて

4

https://github.com/maniacbug/StandardCplusplus/blob/master/ios.cpp#L163に基づいて、私はグローバル変数のデストラクタを呼び出すと、適切CIN、COUT、CERR、詰まり、のwciN、wcout、wcerrとwclogを破棄させることができるとき場合は、最後にし、プログラムを必要とされていると思います。 http://www.csci.csusb.edu/dick/c++std/september/lib-iostreams.htmlから

〜のInit();

効果: Initクラスのオブジェクトを破棄します。この関数は、 からinit_cntに格納された値を減算し、結果格納された値が であれば、cout.flush()、cerr.flush()、clog.flush()、wcout.flush()、 wcerrを呼び出します。 flush()、wclog.flush()。