以普通的舊數據類型和對象爲成員取一個普通的結構體(或類)。請注意,沒有定義默認的構造函數。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++標準嗎?或者是否有必要在實例化之後有一個明確的構造函數或顯式的={}
語句來保證跨所有編譯器的零初始行爲?
實際問題:你想要一個*保證*,你可以依靠這個,或者一個*方法來避免* *?前者爲 – Yakk
。我想確保它是標準的行爲,以便它可以在不同的編譯器中使用。 – selbie