2017-07-28 183 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垃圾數據。並且該字符串被默認初始化爲空。 正如所料。

如果我創建使用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你會看到

對象被構造爲通過表達式::new (pv) T(std::forward<Args>(args)...),其中pv是內部void*指針適於保持T類型的對象存儲。

這意味着std::make_shared<Foo>()基本上是new Foo()。也就是說,它是導致非類成員變量歸零的結構。