2016-11-28 145 views
0

我的問題是: 當我將std::shared_ptr引入到B類中時,它會給其他數據成員進行零初始化。C++ std :: shared_ptr會初始化類中的其他成員數據

的代碼如下給出:

class A 
{ 
    public: 
     int data_a; 
     A():data_a(0){} 
    }; 

    class B 
    { 
    public: 
     int data_b; 
     A a; 
     //shared_ptr<B> ptr_b; // the key point here 
    }; 

    int main() 
    { 
     B b; 
     cout << b.data_b << endl; 
    } 
} 

作爲構件a具有所以B將生成的隱式默認構造函數默認的構造函數。
現在我沒有出臺shared_ptr所以輸出會是:

-858993460 

但是,一旦我介紹了share_ptr入代碼,輸出成爲:

0 

爲什麼?是什麼讓這發生?

在此先感謝。

我使用微軟共混物VS社區2015年版14.025425.01更新3.

+1

訪問'b.data_b'表現出未定義的行爲。 [任何結果](http://www.catb.org/jargon/html/N/nasal-demons.html)都是有效的。 –

+0

謝謝。我知道這一點。但是我想知道當我將shared_ptr'prt_b'引入類B時,是什麼使它產生一個零初始化?你看,當我做出這樣的改變時,結果爲0。 –

+0

您的代碼有一個錯誤。修復這個錯誤,這個謎將消失。如果你的問題是「爲什麼有錯誤的代碼會做一些奇怪的事情」,那是因爲這就是錯誤的本質。 –

回答

1

隱含的默認構造函數將缺省初始化你的標量數據成員,因此他們將有一個不確定的值。至於你的測試用例,當你試圖打印未初始化的對象時,它有未定義的行爲。任何輸出都是有效的。

+0

@ J.Wei就像我說的,這是未定義的行爲。你無法理解輸出,因爲你所做的是無效的。語言中沒有任何內容會使'shared_ptr'導致數據成員的初始化爲零。這只是未定義行爲的效果。 – 0x499602D2

+0

是的,我明白了。你解決了我的難題。這是我對未定義行爲的含義的誤解。非常感謝!!!! –