2011-07-11 273 views
0

求助: 感谢dominic hamon感谢了它。这一切归结为试图调用一个有点空对象的功能。它可以使用对象的一部分而不使用其他对象。std :: map <MyClass,std :: vector <MyClass>>段错误。奇数

我不知道这可能发生。

问题

我曾经历过一个奇怪的分段错误与

std::map< IntVector3, std::vector<IntVector3> >. 

在我MyClass.hpp文件,我有这样的一个私人财产:

std::map< IntVector3, std::vector<IntVector3> > recurData; 

在我MyClass.cpp MyClass的构造函数中的文件i可以运行

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

有很多,我加入是不必要的额外运营商的(> =,< = ...)。 (我试图遵循3的规则)

唯一真正的奇怪是<运营商。这使用一个std :: string来比较。这个快速黑客应该适用于所有x,y,z,如果他们在99以下。

感谢您的帮助,这一直让我疯狂。

+0

你必须确保你的密钥类型的'运营商<'是*严格弱序*:

<典型的实现将是什么。仔细检查是否是这种情况。 –

+0

seg-fault对应哪行代码?你有没有试过把你的代码缩减到最小的测试用例? –

+0

stacktrace?段错在哪里发生?那么IntVector3的复制构造函数呢? – pokey909

回答

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); 
} 
+0

只是改变了我的IntVector3.hpp文件。我交替地完成同意,我的做法是可怕的。感谢您的选择。这虽然没有解决问题。 – luke

+0

好的,在这种情况下,您将需要提供导致问题的一些调用代码的完整*最小*示例。请删除任何不必要/冗余的代码! –

+0

我正在找出答案。我认为这是一个糟糕的指针。我将以简化的代码或解决方案发回任何一种方式。谢谢您的帮助。 – luke

相关问题