的std ::地图&LT; MyClass,std :: vector <myclass>&gt;段故障。奇怪</MyClass的>

时间:2011-07-11 21:59:55

标签: c++ stl segmentation-fault stdvector stdmap

解决: 感谢多米尼克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。

感谢您的帮助,这让我发疯了。

1 个答案:

答案 0 :(得分:1)

使用字符串来实现比较功能是(a)效率低下,(b)破坏。它不会为您提供严格弱的排序,这是std::map所需要的。特别是,它不会传递,即如果a < bb < 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);
}