C++ 完全重建后,故障会消失

C++ 完全重建后,故障会消失,c++,g++,segmentation-fault,C++,G++,Segmentation Fault,在使用g++构建代码时,我不止一次遇到以下问题: 一切似乎都很好。你编译,运行,然后砰的一声——一个segfault不知从何处向你扑来。您开始查看代码,找不到任何东西,执行makeclean&&make,问题就消失了 我在不同的g++版本、不同的机器、不同的内核中看到过这种情况 为什么会发生这种情况?有没有办法阻止它?如果更改头文件,则生成文件中没有机制来确定哪些源文件包含这些头文件,并且需要重新编译。您可能遇到的一个问题是,如果头文件A.h定义了一个类A,并且您添加、删除或重新排列了A的成员,

在使用g++构建代码时,我不止一次遇到以下问题:

一切似乎都很好。你编译,运行,然后砰的一声——一个segfault不知从何处向你扑来。您开始查看代码,找不到任何东西,执行makeclean&&make,问题就消失了

我在不同的g++版本、不同的机器、不同的内核中看到过这种情况


为什么会发生这种情况?有没有办法阻止它?

如果更改头文件,则生成文件中没有机制来确定哪些源文件包含这些头文件,并且需要重新编译。您可能遇到的一个问题是,如果头文件
A.h
定义了一个类
A
,并且您添加、删除或重新排列了
A
的成员,则类的大小会改变。但是,一些源文件中仍在使用旧的大小,因此,当您在堆栈或堆上创建类的实例时,可能会导致某个源文件分配过度或分配不足
makeclean
强制发布有关类的新信息,因为所有源文件都必须重新编译


如果您对头文件进行了重大更改,则可能最安全的做法是完全重建。

您很可能有未定义的行为。最有可能的是,它稍后会回来,让您相信它是您刚才添加的内容。有没有可能与您的Makefile(或等效文件)出错有关?例如,如果A依赖于B,而您在B中进行了更改,则重新生成B,但将A中的旧对象文件与B中的新对象文件链接起来,它是否可以在编译过程中工作,但在运行时崩溃?这非常详细地解释了重建过程中有时会出现的一个常见问题是静态初始化失败。