我在类的私有部分定义了一个枚举类型。我也定义了一个此类型的成员。当我试图在构造函数中初始化这个成员时,运行时会出现内存损坏问题。但是,如果我在同一个构造函数中使用初始化列表来初始化它,就不会出现内存损坏问题。我做错了什么吗?
我将代码简化了一下,如果这是GCC的bug,我确信它是我组合/继承/等所特定的类的组合,但我保证这捕捉了问题的本质。在初始化这个成员之前没有任何东西使用它,并且在完全构建之前没有任何东西使用新创建的对象。这个成员的初始化确实是我在构造函数体中做的第一件事情,当发生内存损坏时,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) { ... }
编辑:看到我的“答案”后,有人能解释一下为什么会有区别吗?我没有在头文件中更改任何内容,显然由于我的打印语句出现在我放置它们的位置并且在一个构建中没有看到错误而在另一个构建中看到了错误,因此对象文件正在重新构建。
我将代码简化了一下,如果这是GCC的bug,我确信它是我组合/继承/等所特定的类的组合,但我保证这捕捉了问题的本质。在初始化这个成员之前没有任何东西使用它,并且在完全构建之前没有任何东西使用新创建的对象。这个成员的初始化确实是我在构造函数体中做的第一件事情,当发生内存损坏时,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) { ... }
编辑:看到我的“答案”后,有人能解释一下为什么会有区别吗?我没有在头文件中更改任何内容,显然由于我的打印语句出现在我放置它们的位置并且在一个构建中没有看到错误而在另一个构建中看到了错误,因此对象文件正在重新构建。
private:
,它还能正常工作吗? - Marcelo Cantos