2011-04-28 3 views
0

Je sais qu'il y a beaucoup de questions avec "* glibc détecté * free(): pointeur invalide", mais ce qui suit est un exemple minimaliste avec boost :: ptr_map:glibc détectée: libre(): pointeur invalide: avec simple boost :: ptr_map exemple

#include <boost/ptr_container/ptr_map.hpp> 
#include <string> 

int main() { 
     boost::ptr_map<std::string, int> map; 
     int one = 1; 
     int* pone = &one; 
     string un = "one"; 
     map.insert(un, pone); 
} 

Le code compile, mais au moment de l'exécution:

boost.library/ptr_container $ ./run.ptrmap 
*** glibc detected *** ./run.ptrmap: free(): invalid pointer: 0x00007ffffd5c4578 *** 
======= Backtrace: ========= 
/lib/libc.so.6[0x7fd5e99202f6] 
/lib/libc.so.6(cfree+0x6c)[0x7fd5e9924c6c] 
./run.ptrmap[0x401066] 
/lib/libc.so.6(__libc_start_main+0xfd)[0x7fd5e98c8abd] 
./run.ptrmap[0x400e79] 
======= Memory map: ======== 
etc.. 

Il a été répété tout au long de sorte que ce type d'erreur se produit lorsque vous essayez de supprimer un pointeur non valide. Cependant, quels changements dans le code très simple ci-dessus permettrait d'éviter cette erreur? Le contexte de cette question est que j'ai du mal à comprendre l'utilisation correcte de boost :: ptr_map. Malheureusement, la documentation officielle de boost est très éparse en ce qui concerne ptr_map (pas de tutoriel, pas d'exemple avec ptr_map). Aucun tutoriel boost :: ptr_map ne semble exister sur le web. J'ai des problèmes pour récupérer des valeurs et accéder aux méthodes des classes mappées que j'ai créées. Ainsi, j'ai essayé de créer l'exemple le plus simple que je pouvais, mais j'ai pris un mauvais départ comme indiqué ci-dessus.

Toute aide avec l'erreur de la glibc ci-dessus et avec ptr_map en général est appréciée. Merci.

Edit: J'ai lu plus de 20 fois, étudié et copié les exemples du tutoriel boost officiel http://www.boost.org/doc/libs/1_46_0/libs/ptr_container/doc/tutorial.html Comme indiqué plus haut, le tutoriel boost couvre à peine ptr_map, afin de lier à elle ne fera pas la moindre différence. Fondamentalement, je suis passé à travers et à travers le manuel du conteneur PTR boost plusieurs fois.

Répondre

1

Tutoriel: http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/tutorial.html (trouvé par googler pour: boost ptr_map)

ptr_map prend possession des pointeurs il est donné, donc il faut donner des objets tas alloué (new). Vous lui avez donné un pointeur vers un objet affecté par la pile, donc quand le ptr_map est nettoyé, il essaie de delete quelque chose qui est sur la pile.

Questions connexes