我在班级的私人部分定义了一个枚举类型。我也定义了这种类型的成员。当我尝试在构造函数体中初始化此成员时,我在运行时遇到内存损坏问题。当我通过相同的构造函数中的初始化列表初始化它时,我不会遇到内存损坏问题。我做错了吗?
我将简化代码,如果它是GCC错误,我确信它是我正在组合/继承/等的特定类的组合,但我保证这会抓住问题的本质。在初始化之前,没有任何东西使用这个成员变量,并且在完全构造之前,没有任何东西使用新创建的对象。这个成员的初始化确实是我在体内做的第一件事,当内存损坏发生时,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)
{
...
}
编辑:看看我的“答案”是什么导致了这个。阅读之后,有人可以向我解释为什么会有所作为吗?我没有更改标题中的任何内容,显然目标文件正在重建,因为当我将它们放入时出现我的print语句并且缺少在一个构建下看到错误而不是另一个构建的错误吗?
为了得到一个很好的解释,我会将其标记为这个问题的答案。
答案 0 :(得分:1)
后人:
似乎make脚本由于某种原因没有获取对这些文件的更改。手动删除对象而不是让makefile中的“干净”目标导致完全重建(这需要一些时间),问题就消失了。