2017-07-28 19 views
9

プレーン・オールド・データ型とオブジェクトをメンバとする通常の構造体(またはクラス)を用意します。デフォルトコンストラクタは定義されていないことに注意してください。make_sharedは、各メンバ変数のデフォルトの初期化(ゼロ初期化)を行いますか?

struct Foo 
{ 
    int x; 
    int y; 
    double z; 
    string str; 
}; 

は、今は、スタック上のfのインスタンスを宣言し、その内容を印刷しようとすると:

{ 
    Foo f; 
    std::cout << f.x << " " << f.y << " " << f.z << f.str << std::endl; 
} 

結果は、x、yおよびzのための印刷されたごみデータです。文字列はデフォルトで空になるように初期化されています。 期待通りです。

Iはmake_sharedと印刷を使用してshared_ptr<Foo>のインスタンスを作成する場合:

{ 
    shared_ptr<Foo> spFoo = make_shared<Foo>(); 
    cout << spFoo->x << " " << spFoo->y << " " << spFoo->z << spFoo->str << endl; 
} 

そして、x、yおよびzはすべて0です。これにより、オブジェクトインスタンスが構築された後、shared_ptrが各メンバに対してデフォルトの初期化(ゼロ初期化)を実行するようになります。少なくとも私はVisual Studioのコンパイラでこれを観察しています。

この標準はC++ですか?または、すべてのコンパイラ間でゼロ初期化の動作を保証するために、明示的なコンストラクタまたは明示的な={}ステートメントをインスタンス化した後に行う必要がありますか?

+0

実践的な質問:これに頼ることができるかどうか、または回避する*方法が*必要か? – Yakk

+0

前者。私はそれが異なるコンパイラに依存することができるような標準的な動作であることを確認したかったのです。 – selbie

答えて

8

this std::make_shared referenceもし

オブジェクトがpvタイプTのオブジェクトを保持するのに適した記憶装置の内部void*ポインタである式::new (pv) T(std::forward<Args>(args)...)であるかのように構成されていることがわかります。

つまり、std::make_shared<Foo>()は、基本的にnew Foo()です。すなわち、それは非クラスのメンバ変数のゼロにつながる構造value initializesです。

関連する問題