什么可能导致这次崩溃?

时间:2009-09-28 15:51:40

标签: c++ gcc

我有一个C ++程序(GCC),当我将一个或多个int成员添加到抽象基类时,程序开始崩溃。在我检查的情况下,似乎通过添加此成员,派生类中的成员退出初始化(或在某些时候被踩踏)。如果我添加更多成员,它开始(不)工作不同。这一切都很奇怪,因为该成员从未在任何地方使用过。我可以注释掉一行,程序重新编译就好了,运行没有错误。

整个程序是〜3KLOC,很难剥离。

我完全不知道从哪里开始寻找。有什么想法?


更新

我发现了这个问题:free - malloc - 内存和delete - ing new - 内存在同一程序中并不安全。

5 个答案:

答案 0 :(得分:7)

100次中的99次我发现如果你改变一个类的数据结构并且你开始得到奇怪的崩溃,那么构建依赖关系不是很正确,即你需要重建一些由于某种原因没有得到重建的东西。 / p>

如果完全清理并重建整个项目并不是一件大事,那么我会放弃一下,然后我们可以将这个答案排除在外。

答案 1 :(得分:6)

离开我的头顶,没有看到任何代码(请参阅你的问题的评论)我会建议一个流氓指针,通常会踩到你没注意到的东西,但引入一个新成员使它踩到你做的事情通知。

尝试添加不同大小或更多(未使用)int成员的成员,或者可能是表单中的字符串:const char xxx[50];以保留更多空间。

答案 2 :(得分:4)

有关崩溃的更多信息会有所帮助,因为程序可能会崩溃的方式多种多样。但是,如果我怀疑它可能是内存错误,我在Linux上做的第一件事就是通过Valgrind (Memcheck)运行程序,看看它能告诉我什么。

另外,在黑暗中,您的构建系统是否正确生成依赖关系?一种可能性是您修改抽象类但不重新编译依赖于抽象类的所有源文件,这可能会有问题。

答案 3 :(得分:1)

尝试在gdb中运行程序。

gdb your_executable

然后按'r'然后输入 当你的代码崩溃时你可以点击'bt'然后输入以查看有问题的代码行。

答案 4 :(得分:1)

更改完课程后,您是否重新编译了所有源代码?

如果您只重新编译了基类或派生类(不确定放置新int的位置),那么所有其他对象的类大小都是错误的。您需要删除所有目标文件并重新构建它们。