4

我在班级的私有部分定义了一个枚举类型。我也定义了这种类型的成员。当我尝试在构造函数主体中初始化此成员时,我在运行时遇到内存损坏问题。当我通过同一个构造函数中的初始化列表对其进行初始化时,我不会遇到内存损坏问题。难道我做错了什么?

我将简化代码,如果它是一个 GCC 错误,我确信它是我正在组合/继承/等的特定类的组合,但我保证这抓住了问题的本质。在初始化之前没有使用此成员变量,并且在完全构造之前没有使用新创建的对象。这个成员的初始化确实是我在body中做的第一件事,当内存损坏发生时,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)
{
  ...
}
  

编辑:请参阅我的“答案”以了解导致此问题的原因。阅读后,有人可以向我解释为什么它会有所不同吗?我没有更改标头中的任何内容,显然目标文件正在重建,因为我将它们放入时出现了我的打印语句,并且在一个构建下没有看到错误,但在另一个构建下没有看到错误?

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

4

1 回答 1

1

为后代:

由于某种原因,make 脚本似乎没有获取对这些文件的更改。手动删除对象而不是让 makefile 中的“干净”目标导致完全重建(这需要一些时间),问题消失了。

于 2010-10-22T14:21:16.853 回答