添加矢量时出现分割故障.(c++)

Segmentation fault when adding a vector. (C++)

本文关键字:故障 c++ 分割 添加      更新时间:2023-10-16

我有一个非常基本的类它有一些方法和一些类变量。一切都很顺利,直到我在头文件中的成员变量中添加了一个向量:

std::vector <std::string> vectorofstuff;

如果我所做的只是添加这一行,那么我的程序运行完美,但在最后,在所有输出都在那里之后,我得到一个关于segfault的消息。

我的第一个猜测是,我需要调用vector的析构函数,但这似乎不起作用。另外,我的理解是,我不需要调用析构函数,除非我使用"new"这个词。

有正确方向的推力吗?谢谢束!

我猜以下发生在你身上,或者它是类似的涉及未实现的依赖/头。不管怎样,我希望这个答案可以出现在谷歌上,帮助一些后来非常困惑的程序员弄清楚为什么他们突然看到任意崩溃。

因此,从经验来看,如果您编译新版本的SomeObject.o,但意外地有另一个目标文件#include和旧版本的SomeObject.hpp,则可能发生这种情况。这将导致损坏,这将由编译器引用过时的成员偏移量等引起。有时,这主要工作,只在销毁对象时产生段错误-无论是相关的还是看似遥远的对象-其他时候,程序立即或在两者之间的某个地方产生段错误;我已经看到了几种排列(很遗憾!)。

对于那些想知道为什么会发生这种情况的人来说,也许这只是我在编程时睡眠太少的反映,但是我在Git子模块的上下文中遇到过这种模式,例如:

  • MyRepo
  • / GuiSubmodule
  • / HelperSubmodule
  • // GuiSubmodule

如果(A)你在GuiSubmodule中有一个新的提交,它还没有被拉入HelperSubmodule的副本,(B)你的makefile编译MyRepo/uiSubmodule/SomeObject.o, (C)另一个翻译单元-无论是在子模块中还是通过#include的危险在主repo中-链接到具有不同类布局的旧版本的SomeObject.hpp…在你最终意识到一个简单的错误之前,你会度过一段有趣的时光,并追逐大量的转移话题。

因为我从头开始拼凑我的构建过程,我可能只是没有正确使用Git/make -或者足够严格(忘记推/拉所有子模块)。可能是后者!我现在看到的奇怪的bug至少少了:)

您可能在类的某个地方损坏了vectorofstuff成员的内存。当调用类析构函数时,也会调用vector的析构函数,它将尝试指向和/或删除无效内存。

我只是瞎弄了一下,为了确定起见,我决定对所有内容进行rm并重新编译。你猜怎么着?这就解决了问题。我不知道为什么,在makefile中我这样做,但无论如何,我很高兴我可以继续前进并继续工作。非常感谢你的帮助!