所以我有一个非常基本的类,它有一些方法和一些类变量。在我向头文件中的成员变量添加一个向量之前,Everythings一直很努力工作:
std::vector <std::string> vectorofstuff;
如果我所做的只是添加这一行,那么我的程序运行完美但最后,在所有输出完成之后,我收到有关seg故障的消息。
我的第一个猜测是我需要在向量上调用析构函数,但这似乎不起作用。另外我的理解是除非我使用“new”这个词,否则我不需要调用析构函数。
是否正朝着正确的方向前进?谢谢串!
答案 0 :(得分:2)
你可能在你班级的某个地方破坏了vectorofstuff
成员的记忆。当调用类析构函数时,也会调用向量的析构函数,它会尝试指向和/或删除无效的内存。
答案 1 :(得分:1)
我想以下任何一个都发生在你身上,或者是类似涉及未实现的依赖项/标题的东西。无论哪种方式,我希望这个答案可能会出现在谷歌上并帮助一些后来,极其困惑的程序员弄清楚为什么他们会突然观察到任意崩溃。
因此,根据经验,如果您编译SomeObject.o的新版本但是意外地有另一个目标文件#include
是旧版本的SomeObject.hpp,则会发生这种情况。这会导致腐败,这将由编译器引用过时的成员偏移等引起。有时这主要起作用并且仅在破坏对象时产生段错误 - 无论是相关的还是看似遥远的对象 - 并且其他时候程序会立即发生段错误或在某处在两者之间;我见过几种排列(遗憾的是!)。
对于想知道为什么这可能发生的人,也许这只是我在编程时得到的睡眠有多少的反映,但我在Git子模块的上下文中遇到过这种模式,例如:< / p>
如果(A)你在GuiSubmodule中有一个新的提交,它尚未被拉入HelperSubmodule的副本,(B)你的makefile
编译MyRepoGuiSubmodule / SomeObject.o,和(C)另一个翻译单元 - 或者在子模块或主要仓库中通过#include
的危险 - 链接旧版本的SomeObject.hpp,它具有不同的类布局...你在一个有趣的时间,并且很多追逐直到你终于意识到这个简单的错误之前,红色的鲱鱼。
由于我从头开始拼凑我的构建过程,我可能只是没有正确使用Git / make - 或者严格来说(忘记推/拉所有子模块)。我正在考虑转移到符号链接,至少暂时我的各个子模块正在他们的主要父项目中“开发”,以便他们被迫同步!
答案 2 :(得分:0)
我一直在玩弄它,并决定,确定一下,对所有事情进行重新编译。你猜怎么着?修好了。我不知道为什么,在makefile中我还是这样做,但无论如何,我很高兴我能继续前进并继续努力。非常感谢所有的帮助!