0

int と多くの bool メンバーを持つ単純なクラス Actor を作成しました。

これは、actor.cpp ファイルからの抜粋です。

 Actor::Actor ()     
:X(0),Y(0),W(14),H(14),speedX(0),speedY(0)
,left(false),right(false),up(false),North(false),
East(false),South(false),West(false),NorthEast(false),
NorthWest(false),SouthEast(false),SouthWest(false){}

...

これは、actor.h ヘッダー ファイルからのものです。

class Actor
{
 private:
    int X;
    int Y;
    unsigned short int W;
    unsigned short int H;

    unsigned short int speedX;
    unsigned short int speedY;

    bool left; 
    bool right; 
    bool up;

    bool North; 
    bool East; 
    bool South; 
    bool West; 
    bool NorthEast; 
    bool NorthWest; 
    bool SouthEast; 
    bool SouthWest;     
 public:        
    Actor();
    ~Actor();

これはエラーなしでコンパイルされ、

しかし、プログラムを実行すると、最初に奇妙な segfault が発生します。

ここで、初期化リスト内のすべての bool をコメント (//,left(false)) に入れ、gcc にすべてをコンパイルさせると、プログラムは完全に実行されます!

なにが問題ですか?初期化リストを介してすべてのクラスメンバーを初期化する方が良いと思いました。

これは g++ のバグでしょうか?

left(false) の代わりに left() を使用してみました。いいえ: プログラムのどこにも new- または *- 演算子を使用していません!

4

1 に答える 1

0

まず、「最初に奇妙なセグメンテーション違反が発生しました」は、エラーの説明にはほど遠いものです。したがって、正確なエラーを投稿してください。また、「gcc にバグが見つかりました」とおっしゃっていたので、gcc は現在バージョン 4.8 です。したがって、使用しているコンパイラとそのコンパイラのバージョンを指定しない限り、デバッグは役に立ちません。

第 2 に、初期化リストは、継承があり、基本クラスの部分や一部のメンバーの初期化で特別な動作が必要な場合に役立ちます。また、重いコンストラクターとそれに対応する重いコピー コンストラクターおよび operator= を持つクラス内のオブジェクトがある場合にも役立ちます。最初にオブジェクトが作成され、次に初期化を行う必要があります。

第三に、POD 型の場合、奇妙な継承の問題がない限り、コンストラクター コードで代入を行うことは問題ありません。

最後に、http: //pastebin.com/x5tuvBFw はファイル名を含むコードであり、gcc4.7 でコンパイルして正常に実行されます (以前のバージョンでも問題ないと思います)。

于 2013-06-01T22:50:25.800 に答える