解决: 感谢多米尼克hamon,感谢它。 这一切都归结为尝试在 kinda null对象上调用函数。它可以使用对象的一部分而不是其他部分。
我不知道这甚至会发生。
问题
我遇到了一个带有
的奇数分段错误std::map< IntVector3, std::vector<IntVector3> >.
在我的MyClass.hpp文件中,我将其设为私有属性:
std::map< IntVector3, std::vector< IntVector3 > > recurData;
在MyClass的构造函数中的MyClass.cpp文件中,我可以运行
std::vector< IntVector3 > pt;
pt.push_back(IntVector3(1,2,3));
recurData[IntVector3(1,2,3)] = pt;
这样运行正常,我没有出错。
稍后在程序中我调用MyClass中的一个函数来做同样的事情,改变recurData。不在构造函数中。这会导致分段错误。我的知识没有其他任何影响recurData的变化。
IntVector3的可实现性是: http://pastebin.com/Hc83xapk
我添加了许多不需要的额外运算符(&gt; =,&lt; = ...)。 (我试图遵循3的规则)
唯一真正奇怪的是&lt;运营商。这使用std :: string进行比较。如果它们低于99,这个快速黑客应适用于所有x,y,z。
感谢您的帮助,这让我发疯了。
答案 0 :(得分:1)
使用字符串来实现比较功能是(a)效率低下,(b)破坏。它不会为您提供严格弱的排序,这是std::map
所需要的。特别是,它不会传递,即如果a < b
和b < c
,它不一定会给你a < c
。这将完全弄乱std::map
。
<
的典型实现类似于:
bool operator< (const IntVector3 &a, const IntVector3 &b)
{
if (a.z < b.z) { return true; }
if (a.z > b.z) { return false; }
if (a.y < b.y) { return true; }
if (a.y > b.y) { return false; }
return (a.x < b.x);
}