2009-08-11 59 views
1
typedef std::map<int, MyObject*> MyMap; 
MyMap* myMap = new MyMap; 
// ... 
myMap->insert(MyMap::value_type(0, objectOfType_MyObject)); 

爲什麼我的堆棧跟蹤下降到存儲'的std ::對象時map`代碼崩潰

std::less<int>::operator() 

代碼會崩潰嗎?

據我所知,如果我使用自定義鍵類,我必須提供一個比較器,但這是一個int。

我從來沒有使用地圖之前,它可能是一個愚蠢的問題,但我一直堅持這個很長一段時間了。

感謝

+0

什麼是所有的堆棧跟蹤看起來像? – GManNickG 2009-08-11 17:03:09

+0

提供了一個完整的堆棧跟蹤或使用valgrind來檢測一些內存誤用:-) – 2009-08-11 17:04:17

+0

可能是一個愚蠢的評論..但你確定你沒有刪除myMap對象之前插入? – Naveen 2009-08-11 17:21:34

回答

11

此代碼(編譯&運行)對我來說:

#include <map> 

class MyObject 
{ }; 

int main(void) 
{ 
    typedef std::map<int, MyObject*> MyMap; 

    MyMap *myMap = new MyMap; 
    MyObject *obj = new MyObject; 

    myMap->insert(MyMap::value_type(0, obj)); 

    delete obj; 
    delete myMap; 
} 

所以問題在於細節(// ...或者什麼MyObject可以做)或其他地方。你可以稍微修復一下,以提供幫助。儘可能地堆疊分配東西。你真的需要一個指向地圖的指針嗎?我建議你不要:

#include <map> 

class MyObject 
{ }; 

int main(void) 
{ 
    typedef std::map<int, MyObject*> MyMap; 

    MyMap myMap; 
    MyObject *obj = new MyObject; 

    myMap.insert(MyMap::value_type(0, obj)); 

    delete obj; 
} 

你真的需要存儲指向對象或對象的指針嗎?

#include <map> 

class MyObject 
{ }; 

int main(void) 
{ 
    typedef std::map<int, MyObject> MyMap; 

    MyMap myMap; 

    myMap.insert(MyMap::value_type(0, MyObject())); 
} 

更小,幾乎不可能得到內存泄漏。如果你需要存儲指針,爲多態行爲,檢查出boost::ptr_container library,它有一個map adapter that stores pointers

+0

非常好的答案;在最後一種情況下,他可能還需要爲MyObject定義一個拷貝構造函數。 – Indy9000 2009-08-11 17:40:56

+0

我的問題是我在初始化我的課程時不是.clear()地圖。 (即使它是大小0)。我正在存儲Obj-C對象 – Sam 2009-08-14 10:13:01