添加矢量时出现分段错误。 (C ++)

时间:2011-10-03 03:49:56

标签: c++ vector segmentation-fault

所以我有一个非常基本的类,它有一些方法和一些类变量。在我向头文件中的成员变量添加一个向量之前,Everythings一直很努力工作:

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

如果我所做的只是添加这一行,那么我的程序运行完美但最后,在所有输出完成之后,我收到有关seg故障的消息。

我的第一个猜测是我需要在向量上调用析构函数,但这似乎不起作用。另外我的理解是除非我使用“new”这个词,否则我不需要调用析构函数。

是否正朝着正确的方向前进?谢谢串!

3 个答案:

答案 0 :(得分:2)

你可能在你班级的某个地方破坏了vectorofstuff成员的记忆。当调用类析构函数时,也会调用向量的析构函数,它会尝试指向和/或删除无效的内存。

答案 1 :(得分:1)

我想以下任何一个都发生在你身上,或者是类似涉及未实现的依赖项/标题的东西。无论哪种方式,我希望这个答案可能会出现在谷歌上并帮助一些后来,极其困惑的程序员弄清楚为什么他们会突然观察到任意崩溃。

因此,根据经验,如果您编译SomeObject.o的新版本但是意外地有另一个目标文件#include是旧版本的SomeObject.hpp,则会发生这种情况。这会导致腐败,这将由编译器引用过时的成员偏移等引起。有时这主要起作用并且仅在破坏对象时产生段错误 - 无论是相关的还是看似遥远的对象 - 并且其他时候程序会立即发生段错误或在某处在两者之间;我见过几种排列(遗憾的是!)。

对于想知道为什么这可能发生的人,也许这只是我在编程时得到的睡眠有多少的反映,但我在Git子模块的上下文中遇到过这种模式,例如:< / p>

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

如果(A)你在GuiSubmodule中有一个新的提交,它尚未被拉入HelperSubmodule的副本,(B)你的makefile编译MyRepoGuiSubmodule / SomeObject.o,和(C)另一个翻译单元 - 或者在子模块或主要仓库中通过#include的危险 - 链接旧版本的SomeObject.hpp,它具有不同的类布局...你在一个有趣的时间,并且很多追逐直到你终于意识到这个简单的错误之前,红色的鲱鱼。

由于我从头开始拼凑我的构建过程,我可能只是没有正确使用Git / make - 或者严格来说(忘记推/拉所有子模块)。我正在考虑转移到符号链接,至少暂时我的各个子模块正在他们的主要父项目中“开发”,以便他们被迫同步!

答案 2 :(得分:0)

我一直在玩弄它,并决定,确定一下,对所有事情进行重新编译。你猜怎么着?修好了。我不知道为什么,在makefile中我还是这样做,但无论如何,我很高兴我能继续前进并继续努力。非常感谢所有的帮助!