2012-01-20 119 views
0
#include <iostream> 
struct D{}; 
struct B{}; 

struct C 
{ 
    C(); 
}; 

struct A 
{ 
    A(); 
    B * b; 
    C * c; 
    D * d; 

    static A& pInstance() 
    { 
     static A a; 
     return a; 
    } 
}; 


A::A() 
{ 
    b = new B; 
    c = new C; 
    d = new D; 
} 

C::C() 
{ 
    A::pInstance().b; 
} 

int main() 
{ 
    A::pInstance(); 

    std::cin.ignore(); 

} 

上述情況是否存在潛在的問題,因爲C構造函數調用A字段,而A類尚未完全構造。在另一個構造函數中實例化的對象的構造函數中調用函數

我在生產這個代碼。應用程序似乎在開始時隨機崩潰,我想知道這是否可以歸因於這種「差」設計。

+0

如果第一行是'static A&A :: pInstance()',或者2個調用有額外的'A ::'? – kkm

+0

當你輸入構造函數時,這個類已經完全構造了。 –

+0

這樣的問題需要一個完整的例子來正確回答。請包括所需的聲明/定義。 –

回答

5

它明確表明其未定義行爲:(§6.7/4)「如果控制重新進入遞歸而可變被初始化的聲明,該行爲是未定義」

+0

+1:謝謝。我沒有交標準。 – Johnsyweb

+0

+1:完全正確! – Chubsdad

+0

@ MSalters:非常感謝。 – Guillaume07

1

[是否]上述情況可能存在任何問題,因爲C構造函數調用A字段,而A類尚未完全構造。

是的。這可能會導致您的問題the behaviour is undefined...

您在staticAa)完全建立之前,初始化的C一個實例。 a然後在C的構造函數中引用。由於a未被構建,因此您可以輸入遞歸循環*

This is what happens when you build this with g++.

+0

好的,謝謝,我會測試另一個設計,看看bug是否消失(例如5天沒有崩潰)。我在windows下使用MSVC2010編譯器。 – Guillaume07

相關問題