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, __val=@0x7fffffffe6d8) 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==NULL は p が開始されているかどうかをチェックしません。それが、セグメンテーション違反が発生し続ける理由だと思います。

4

2 に答える 2

3

handコンストラクターでメンバーを明示的に初期化しない場合Player、既定のコンストラクターCardpileが使用されます。

既定のコンストラクターを定義していない場合は、コンパイラによって作成されます。

でプログラムをコンパイルしてリンクすると-g、gdb はプログラムがクラッシュしたスタック トレースを表示できます。

gdb program core

そして、gdb 内に を入力しbtます。これにより、セグメンテーション違反時の完全なコール スタックが表示されます。

于 2012-11-25T20:55:13.630 に答える
3

それは何であるかに依存しCardpileます。POD の場合は、いいえ:

class Cardpile1{
   int x;
};

そうでない場合は、はい:

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

handどちらの場合にも存在しますが、CardpilePOD として定義されている場合、そこからの読み取りは不正です。

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

Player p;
p.hand1.x;   //illegal
p.hand2.x;   //legal
于 2012-11-25T20:55:36.063 に答える