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

Pourquoi mon accident de code avec une trace de pile allant jusqu'àaccident code lors de l'enregistrement des objets dans `std :: map`

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

?

Je comprends que si j'utilise une classe de clé personnalisée que je dois fournir un comparateur, mais c'est un int.

Je n'ai jamais utilisé de cartes auparavant et c'est probablement une question stupide, mais je suis bloqué depuis des lustres.

Merci

+0

À quoi ressemble toute la pile? – GManNickG

+0

fournir une trace de pile complète ou utiliser valgrind pour détecter une mauvaise utilisation de la mémoire :-) –

+0

Peut-être un commentaire stupide..mais êtes-vous sûr de ne pas supprimer l'objet myMap avant l'insertion? – Naveen

Répondre

11

Ce code fonctionne (compile & runs) pour moi:

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

Le problème réside dans les détails (// ... ou ce que MyObject peut faire) ou ailleurs. Vous pouvez probablement arranger un peu les choses pour vous aider. Essayez d'empiler allouer des choses quand vous le pouvez. Avez-vous réellement besoin d'un pointeur sur une carte? Je vous suggère de ne pas:

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

Et avez-vous réellement besoin de stocker des pointeurs sur des objets ou des objets?

#include <map> 

class MyObject 
{ }; 

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

    MyMap myMap; 

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

Beaucoup plus petit, et presque impossible d'obtenir des fuites de mémoire. Si devez besoin de stocker des pointeurs, pour un comportement polymorphique, consultez boost::ptr_container library, qui a un map adapter that stores pointers.

+0

Très bonne réponse; Dans le dernier cas, il peut également avoir besoin de définir un constructeur de copie pour MyObject. – Indy9000

+0

Mon problème était que je ne faisais pas .clear() sur la carte lors de l'initialisation de ma classe. (Même si c'est la taille 0). Je stocke des objets Obj-C – Sam

Questions connexes