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

Warum kommt der Code Absturz mit einem Stack-Trace hinunter zu-Code Absturz, wenn Objekte in `std :: map`

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

speichern?

Ich verstehe, dass, wenn ich eine benutzerdefinierte Schlüsselklasse verwenden, dass ich einen Komparator bereitstellen muss, aber das ist ein Int.

Ich habe noch nie Karten verwendet und es ist wahrscheinlich eine dumme Frage, aber ich bin seit Ewigkeiten darauf fest.

Dank

+0

Wie sieht die Stapelverfolgung aus? – GManNickG

+0

bieten eine komplette Stack-Trace oder verwenden Sie Valgrind, um etwas Speichermissbrauch zu erkennen :-) –

+0

Kann ein dummer Kommentar..aber bist du sicher, dass Sie myMap-Objekt nicht vor dem Einfügen löschen? – Naveen

Antwort

11

Dieser Code (kompiliert & Läufe) funktioniert für mich:

#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; 
} 

So ist das Problem in den Details liegt (// ... oder was MyObject tun können) oder anderswo. Sie können wahrscheinlich die Dinge ein wenig verbessern, um zu helfen. Versuche Stacks zu verteilen, wenn du kannst. Brauchen Sie tatsächlich einen Zeiger auf eine Karte? Ich schlage vor, Sie nicht:

#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; 
} 

Und müssen Sie tatsächlich Zeiger auf Objekt oder Objekte speichern?

Viel kleiner und fast unmöglich, Speicherlecks zu bekommen. Wenn Sie tun müssen müssen Zeiger, für polymorphes Verhalten, überprüfen Sie boost::ptr_container library, die eine map adapter that stores pointers hat.

+0

Sehr gute Antwort; Im letzten Fall muss er möglicherweise auch einen Kopierkonstruktor für MyObject definieren. – Indy9000

+0

Mein Problem war, dass ich die Karte nicht lösche, wenn ich meine Klasse initialisiere. (Obwohl es Größe 0 ist). Ich speichere Obj-C-Objekte – Sam