我在班级的私有部分定义了一个枚举类型。我也定义了这种类型的成员。当我尝试在构造函数主体中初始化此成员时,我在运行时遇到内存损坏问题。当我通过同一个构造函数中的初始化列表对其进行初始化时,我不会遇到内存损坏问题。难道我做错了什么?
我将简化代码,如果它是一个 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)
{
...
}
编辑:请参阅我的“答案”以了解导致此问题的原因。阅读后,有人可以向我解释为什么它会有所不同吗?我没有更改标头中的任何内容,显然目标文件正在重建,因为我将它们放入时出现了我的打印语句,并且在一个构建下没有看到错误,但在另一个构建下没有看到错误?
为了得到一个很好的解释,我将其标记为这个问题的答案。