c++ 11初始化列表中有多个bool的段错误



我写了一个简单的类Actor,里面有int型和很多bool型成员:

下面是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();

这个编译没有任何错误,

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

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

怎么了?我认为最好通过初始化列表初始化所有类成员。

这可能是g++的bug吗?

我已经尝试过使用left()而不是left(false)。不:我没有在任何地方使用new-或*-操作符!

首先,"我在一开始就得到了一个奇怪的段错误"甚至不接近错误描述。所以请贴出准确的错误。也因为你说"在gcc中发现了一个bug",gcc目前是4.8版本。所以,除非你告诉你正在使用哪个编译器和哪个版本的编译器,否则调试是无用的。

第二,初始化列表是有用的,当你有继承,并希望在基类部分和/或一些成员初始化一些特殊的行为。如果类中的对象具有重构造函数和相应的重复制构造函数和operator=,那么它也很有用,在这种情况下,您可以在初始化列表中调用所需的构造函数,从而节省在构造函数代码中进行复制的时间,因为否则,首先对象将被创建,然后您将不得不进行一些初始化。

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

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

最新更新