2010-10-22 52 views
4

我有我的课的私人部分定义的枚举类型。我也有这种类型的成员。当我尝试在构造函数体中初始化这个成员时,我在运行时遇到内存损坏问题。当我通过相同的构造函数中的初始化列表初始化它时,我没有得到内存损坏问题。难道我做错了什么?成员初始化:GCC中的错误还是我的想法?

我会简化代码,如果它是一个GCC错误,我确信它是我组合/继承/等的特定类的组合,但我保证这捕获了问题。在初始化之前,Nothing没有使用这个成员变量,并且在完全构造完成之前,没有任何操作使用新创建的对象。这个成员的初始化确实是我在主体中做的第一件事情,当内存损坏发生时,valgrind说它正在我初始化变量的那一行。 Valgrind的说,这是大小的无效写4.

相关头代码:

 

private: 
    enum StateOption{original = 0, blindside};  
    StateOption currentState; 
 

相关的.cpp代码(会导致内存破坏和崩溃):

 

MyClass::MyClass(AClass* classPtr) : 
    BaseClass(std::string("some_setting"),classPtr) 
{ 
    currentState = original; 
    ... 
} 
 

相关的.cpp代码(不会导致内存损坏和崩溃):

 

MyClass::MyClass(AClass* classPtr) : 
    BaseClass(std::string("some_setting"),classPtr), 
    currentState(original) 
{ 
    ... 
} 
 

编辑:请参阅我的“答案”是什么导致了这一点。阅读完之后,有人可以向我解释为什么它有所作为吗?我没有更改标题中的任何内容,显然目标文件正在重建,因为我在打印时出现了打印语句,而且缺少在一个版本下看到的错误,而是看不到另一个版本的错误。

为了一个很好的解释,我将它标记为这个问题的答案。

+0

当你说“没有任何东西在它被初始化之前使用这个成员变量”,你确定包括初始化列表中的其他元素,甚至间接吗?还有别的东西叫做'original'吗? – 2010-10-22 13:48:30

+0

如果您删除'private:',它会起作用吗? – 2010-10-22 13:51:07

+0

@油是的,我是积极的。基类没有实现类似这个功能的东西,而这个类是继承层次上的最后一个类(它只有两类深度)。单词“original”甚至不出现在基类的.h或.cpp中。尽管如此,感谢您检查脑死的错误。我之前做过类似的工作:) – 2010-10-22 13:53:25

回答

1

为后人:

看来好像化妆脚本不是皮卡了这些文件的修改出于某种原因。手动删除对象而不是让我们的make文件中的“干净”目标导致完全重建(这需要一些时间),并且问题消失。

+0

这个原因可能是您修改了Makefile – doc 2010-10-22 14:31:30

+0

添加ccache(http://ccache.samba.org/)将大大缩短重新编译时间。 – 2010-10-22 23:40:51

+0

最常见的原因是Makefile没有表示目标文件和头文件之间的依赖关系,所以更改头文件无法重新编译依赖它的所有代码。 – 2010-10-22 23:54:19