3
我真的試圖推遲提出這個問題,因爲它看起來應該是一個簡單的問題,但這裏就是這樣。我一直在一段新的代碼中追逐段錯誤。我已經包含了下面顯示問題的最小塊。其餘的代碼已經工作了一段時間。當訪問成員STL地圖時出現C++ segfault
class A {
private:
std::map <uint64_t, uint32_t> memberMap;
public:
A();
~A();
void access() {
const uint64_t key = 1;
uint32_t value = 1;
if(memberMap.count(key) == 0) {
memberMap.insert(std::pair<uint64_t, uint32_t>(key, value));
} else if(memberMap[key] < value) {
memberMap[key] = value;
}
}
};
class B : public BsParent {
private:
A handler;
public:
B();
~B();
uint64_t access(Data dat) {
//...
handler.access();
//...
}
};
我到目前爲止已經試過......
- 你會發現有明確的零個指針。
- 我檢查了A()被調用。
- 來自gdb的堆棧跟蹤(yep,已經廣泛使用並且沒有明顯的空指針)將stme_tree.h:1157中的責任釘在了定義pair函數的指針上。但是,如果我註釋掉插入行和else if塊,則程序仍會在stl_tree中另一個模糊的行號處進行段錯誤。
- 我測試了access()中的代碼,使memberMap成爲訪問中的局部變量並在循環中調用代碼。
有關進一步調試步驟的任何想法或建議?
嘗試valgrind和/或海灣合作委員會或叮噹的記憶消毒劑選項,感覺就像你玩的死對象或堆放在某處堆棧或堆棧。如果沒有完整的,最小的代碼片段,實際上會重現該問題,則無法分辨。 – Mat
似乎還有其他東西破壞了屬於地圖的內存。嘗試放置數據修改斷點。 –
請發表[mcve]。如果我按照原樣舉例,我無法重現問題。 –