C ++ 11 Segfault在初始化列表中有几个bool

时间:2013-06-01 18:17:44

标签: c++ g++ segmentation-fault boolean initialization-list

我写了一个带有int的简单类Actor和很多bool成员:

这是来自actor.cpp文件的一个exerpt

 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();

此编译没有任何错误,

但如果我运行该程序,我会在开始时得到一个奇怪的段错误。

现在如果我将初始化列表中的所有bool放入注释(//,左(false))并获取gcc来编译所有内容,程序运行完美!

有什么问题?我认为通过初始化列表初始化所有类成员会更好。

这可能是一个g ++错误吗?

我已经尝试过使用left()而不是left(false)。不,我在任何地方都没有使用新的或* - 运算符!

1 个答案:

答案 0 :(得分:0)

首先,“我在开始时得到一个奇怪的段错误”甚至不接近错误描述。所以请发布确切的错误。此外,既然你说“在gcc中发现了一个bug”,gcc目前的版本是4.8。因此,除非您告诉使用哪个编译器以及您正在使用的编译器版本,否则调试无用。

其次,当您具有继承并且希望在基类部分和/或某些成员初始化上有某些特殊行为时,初始化列表很有用。如果你的类中的对象具有繁重的构造函数和相应的大量复制构造函数和operator =,它也很有用,在这种情况下,你可以在初始化程序列表中调用所需的构造函数并保存在构造函数代码中执行复制,否则,首先创建对象然后你必须做一些初始化。

第三,对于POD类型,除非你有一些奇怪的继承问题,否则在构造函数代码中进行赋值应该没问题。

最后,http://pastebin.com/x5tuvBFw是代码,带有文件名,它在gcc4.7上编译并运行正常(我猜甚至更早版本)