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

C++ 添加向量时出现分段错误。(C+;+;),c++,vector,segmentation-fault,C++,Vector,Segmentation Fault,所以我有一个非常基本的类,它有一些方法和一些类变量。在我将向量添加到头文件中的成员变量之前,一切都很正常: std::vector <std::string> vectorofstuff; std::uff向量; 如果我所做的只是添加这一行,那么我的程序运行得很好,但在最后,在所有的输出都在那里之后,我得到一条关于seg故障的消息 我的第一个猜测是我需要调用向量上的析构函数,但这似乎不起作用。另外,我的理解是,除非我使用“new”这个词,否则我不需要调用析构函数 有没有朝正确的方

所以我有一个非常基本的类,它有一些方法和一些类变量。在我将向量添加到头文件中的成员变量之前,一切都很正常:

std::vector <std::string> vectorofstuff;
std::uff向量;
如果我所做的只是添加这一行,那么我的程序运行得很好,但在最后,在所有的输出都在那里之后,我得到一条关于seg故障的消息

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


有没有朝正确的方向推动?谢谢大家

您可能正在破坏类中某个
vectorofsuff
成员的内存。当类析构函数被调用时,向量的析构函数也会被调用,它会试图指向和/或删除无效内存。

我在胡闹,决定,只是为了确保,对所有内容都执行rm并重新编译。你猜怎么着?这就解决了问题。我不知道为什么,在makefile中我还是这样做了,但不管怎样,我很高兴我能继续前进并继续工作。非常感谢你的帮助

我猜以下情况要么发生在您身上,要么与未实现的依赖项/头相关。不管怎样,我希望这个答案能出现在谷歌上,帮助一些后来极度困惑的程序员弄清楚为什么他们突然发现了任意崩溃

因此,根据经验,如果您编译了新版本的
SomeObject.o
,但意外地拥有另一个对象文件
#包含
SomeObject.hpp的旧版本,则可能会发生这种情况。这会导致损坏,这将由编译器引用过时的成员偏移量等引起。有时,这主要起作用,仅在销毁对象(相关或看似遥远的对象)时产生segfaults,而有时程序会立即或在两者之间产生segfaults;我见过几个排列(遗憾的是!)

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

  • MyRepo
  • /
    GuiSubmodule
  • /
    HelperSubmodule
  • //
    GuiSubmodule
如果(A)您在
GuiSubmodule
中有一个新提交,该提交尚未被拉入
HelperSubmodule
的副本中,(B)您的
makefile
编译
MyRepo/uiSubmodule/SomeObject.o
,以及(C)另一个翻译单元-无论是在子模块中还是在主回购中,通过
#include
-链接到具有不同类布局的较旧版本的
SomeObject.hpp
。。。你会玩得很开心,会有很多的小把戏,直到你最终意识到这个简单的错误


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

请发布您的实际代码。声明向量不是问题。你可以使用valgrind.org/“>valgrind(如果你在一个支持它的平台上)来解决这个问题。你永远不需要自己调用析构函数,我的意思是永远不需要,除非你做了一件叫做“就地新”的事情,“我可以向你保证没有。显然,这行代码没有问题,您需要共享更多代码。发布复制此问题的最小代码量。您真正的问题可能不是向量,因为您没有更改
std::string
std::vector
类,而是另一个问题,它被掩盖,直到您将包含
sumofurls
的类变大。请尝试在调试器中运行该程序,并查看从何处获得SEGFULT,请记住该问题实际上可能是由早期内存损坏引起的。呃,很抱歉,我忘了您必须发布如下链接:@InBetween:您的makefile可能已断开(请检查每个编译单元的依赖关系…)我根本并没有向矢量of文件添加任何内容,也并没有触及它,只是将该行添加到了我的.h文件中。我将如何腐蚀Stuff的矢量?(我不是想说挖苦话,我真的想知道,哈哈)@InBetween:例如,试图写入同一类中的静态数组,但未能在其范围内操作。甚至更愚蠢的事情,比如调用
memset(this,0,sizeof(*this)
(相信我,我已经看到了这些)…我认为这支持@Benoit之前的评论和我的(迟到了很多)答案是,这似乎是由于某些头文件/对象文件在类布局或类似问题上不一致造成的。这实际上是错误的,因为代码的某些部分可能会以不正确的对象偏移量来读/写,等等。很高兴你把它整理好了!我也是……最终;-)