2011-07-11 485 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

相關問題