2012-11-25 127 views
4

我的課的開頭是:自動初始化?

class Player{ 
private: 
    Cardpile hand; 
    ... 
} 

哪裏Cardpile是另一個類。如果我這樣做Player *p=new Player();手自動初始化?我問這是因爲我試圖找出分段錯誤。我在我的代碼中到處都是。我能想到的最後一件事是hand未初始化。

編輯:這是我得到的分割錯誤。 Card是Cardpile內部的一個類。我知道Card和Cardpile都可以使用。

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000402ac0 in __gnu_cxx::new_allocator<Card*>::construct (this=0x6070a8, __p=0x4015c6, [email protected]) at /usr/include/c++/4.4/ext/new_allocator.h:105 
105   { ::new((void *)__p) _Tp(__val); } 

編輯:Cardpile類:

class Cardpile : private vector<Card*> { 
    public: 
    using vector<Card*>::size; 
    using vector<Card*>::at; 
    Cardpile(); 
... 
} 
Cardpile::Cardpile(){} 

編輯:這是一個很酷的事實:P ==如果p開始NULL不檢查。我想這就是爲什麼我不斷收到分段錯誤。

+0

這取決於您的Cardpile類的構造函數。顯示完整的'Cardpile'定義,數據成員和構造函數(如果有的話)。 –

+1

你可能會更喜歡'std :: vector '而不是'std :: vector '。 – fredoverflow

回答

3

如果您在Player構造函數中沒有明確指定成員hand,那麼將使用默認構造函數Cardpile

如果您尚未定義默認構造函數,編譯器將創建一個。

當你編譯和-g鏈接程序,GDB可以顯示你的程序崩潰的堆棧跟蹤:

gdb program core 

然後GDB裏輸入bt。這將顯示分段故障時的完整調用堆棧。

+0

編譯器生成的'Cardpile'構造函數可以讓'Cardpile'的成員未初始化。 –

+0

@LuchianGrigore是的,當然,這一切都取決於'Cardpile'是如何定義的。在OP發現「Cardpile」之前,我們可以猜測。 –

3

這取決於什麼Cardpile是。如果它是一個POD,則沒有:

class Cardpile1{ 
    int x; 
}; 

如果不是的話,那麼是:

class Cardpile2{ 
    Cardpile2() : x(0) {} 
    int x; 
}; 

hand將存在這兩種情況下,從中讀取是非法的,如果Cardpile被定義爲莢。

class Player{ 
    public: 
    Cardpile1 hand1; 
    Cardpile2 hand2; 
}; 

Player p; 
p.hand1.x; //illegal 
p.hand2.x; //legal 
+0

我只有一個Cardpile實例在播放器中。 – user44322

+0

@ user44322我知道,我把2弄清楚了。第一個是POD類,從它讀取是非法的。第二個不是POD,從它讀取是非法的。我將它們命名爲Cardpile 1和2。 –

+0

由於他初始化了'Player',所以它實際上並不僅僅依賴於'Cardpile',不管它是否是POD,而是取決於Player'是否具有構造函數!如果'Player'確實有一個構造函數,'Cardpile'可以從構造函數中獲得任何初始化,否則它也會初始化值。 –