Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 成员初始化:GCC中的bug还是我的想法?_C++_Linux_G++_Member Initialization - Fatal编程技术网

C++ 成员初始化:GCC中的bug还是我的想法?

C++ 成员初始化:GCC中的bug还是我的想法?,c++,linux,g++,member-initialization,C++,Linux,G++,Member Initialization,我在类的private部分定义了一个枚举类型。我也定义了这种类型的成员。当我尝试在构造函数体中初始化此成员时,在运行时会出现内存损坏问题。相反,当我通过同一构造函数中的初始化列表初始化它时,不会出现内存损坏问题。我做错什么了吗 我将简化代码,如果它是一个GCC错误,我确信它是我正在组合/继承/等的特定类的组合,但我保证这抓住了问题的本质。在初始化此成员变量之前,不会使用它,在完全构造新创建的对象之前,也不会使用它。这个成员的初始化确实是我在主体中做的第一件事,当内存损坏发生时,valgrind说

我在类的private部分定义了一个枚举类型。我也定义了这种类型的成员。当我尝试在构造函数体中初始化此成员时,在运行时会出现内存损坏问题。相反,当我通过同一构造函数中的初始化列表初始化它时,不会出现内存损坏问题。我做错什么了吗

我将简化代码,如果它是一个GCC错误,我确信它是我正在组合/继承/等的特定类的组合,但我保证这抓住了问题的本质。在初始化此成员变量之前,不会使用它,在完全构造新创建的对象之前,也不会使用它。这个成员的初始化确实是我在主体中做的第一件事,当内存损坏发生时,valgrind说它就在我初始化变量的那一行。Valgrind说这是一个大小为4的无效写入

相关标题代码:


private:  
  enum StateOption{original = 0, blindside};    
  StateOption currentState;
相关.cpp代码(导致内存损坏和崩溃):

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

编辑:查看我的“答案”,了解导致此问题的原因。读完后,有谁能向我解释一下为什么会有不同?我没有更改头中的任何内容,而且很明显,对象文件正在重建,因为当我将它们放入时,我的print语句出现了,并且在一个构建中看不到bug,而在另一个构建中看不到bug

为了更好的解释,我将把它作为这个问题的答案。

为了子孙后代:


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

当您说“在初始化之前没有任何东西使用此成员变量”时,您确定在初始化列表中包括其他元素,甚至是间接的吗?还有什么叫做“原始”的吗?如果你删除了“私人:”,它还能用吗?@Oil是的,我是肯定的。基类没有实现类似的功能,而这个类是继承层次结构上的最后一个类(只有两个类深)。“original”一词甚至不出现在基类的.h或.cpp中。不过,谢谢你检查一个致命的错误。我以前也做过类似的工作:)在找到工作版本和非工作版本之间的区别之前,您是否尝试过减少代码?@oil另外,初始化列表实际上与我代码中的实际列表几乎相同。不同的名称,但这就是我所更改的。原因可能是您修改了Makefile添加ccache()将大大缩短重新编译时间。最常见的原因是Makefile不表示对象文件和头文件之间的依赖关系,因此,更改头无法重新编译依赖于它的所有代码。

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

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