2015-12-04 46 views
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成爲訪問中的局部變量並在循環中調用代碼。

有關進一步調試步驟的任何想法或建議?

+0

嘗試valgrind和/或海灣合作委員會或叮噹的記憶消毒劑選項,感覺就像你玩的死對象或堆放在某處堆棧或堆棧。如果沒有完整的,最小的代碼片段,實際上會重現該問題,則無法分辨。 – Mat

+0

似乎還有其他東西破壞了屬於地圖的內存。嘗試放置數據修改斷點。 –

+1

請發表[mcve]。如果我按照原樣舉例,我無法重現問題。 –

回答

0

可能你已經修整了原始代碼以保持簡單性,但它沒有正確傳達問題並且不可重現。

儘管它看起來沒有任何問題,但如果您使用非本地和本地類類型鍵/值對的映射,則可能需要這兩者的複製構造函數。