J’utilise les listes de la librairie standar c++, et a un moment je me retrouve avec un segmentation fault lorsque j’essaye d’inserer un element (push_back et push_front pareil).
Pourtant tout marche bien peandant un bon moment, j’ai une liste de pas mal d’elements et d’un coup ca bloque.
J’ai essayé de catcher les exception voir si je fait pas une erreur quelque part, donc a chaque fois que je fais une operation sur ma liste (push_back, erase…) je fait ca :
Et met le sur chacune de tes lignes. Ca plantera en t’affichant la ligne. Sinon gdb + bt fera tout aussi bien l’affaire (et c’est moins fastidieux). Sinon la taille n’a normalement rien à voir vu que la liste grandit en conséquence (-> std::list::push_back)
j’ai deja fait quelque chose du genre (j’ai mis des cout que j’ai deplacé jusqu’a touvrer sur quelle ligne ca plante). Donc je sais precisement ou ca plante : lorsque je fait un push_back. J’ai mis un cout juste avant et juste apres et seul mon premier cout est affiché.
Je sais que la liste grandit en conséquence mais j’ai affiché la taille max pour voir si j’avais pas un probleme de memoire.
Les opération que je fait sont :
erase et push_back c’est tout. Puis des parcours de liste classique avec des iterateurs
Alors, je suis dans une classe.
j’ai declaré ma liste comme membre private de cette classe :
std::list <int> CC;
et voila la fonction que j’apelle lorsque je veut supprimer un element (je recherche le minimum, mais pas le minimum de ma liste car ce sont en fait des index qui correspondent a des valeur dans un tableau) :
Breakpoint 4, Graphe::addToCC (this=0xbffa2f94, v=99696) at Graphe.cc:184
184 CC.push_back(10);
(gdb) print CC
$1 = {<std::_List_base<int,std::allocator<int> >> = {
_M_impl = {<std::allocator<std::_List_node<int> >> = {<__gnu_cxx::new_allocator<std::_List_node<int> >> = {<No data fields>}, <No data fields>},
_M_node = {_M_next = 0x8118ce0, _M_prev = 0x8223608}}}, <No data fields>}
et ca plante comme ca :
Program received signal SIGSEGV, Segmentation fault.
0xb7ddfc64 in free () from /lib/tls/i686/cmov/libc.so.6
qu’est ce que je peut faire pour trouver ou est le probleme?
J’ai essayé push_front et push_back font la meme erreur de segmentation fault et si j’enleve un element de la liste (pop_back) la il ne fait plus le segmentation fault a cet endroit.
vu que je ne vois pas d’erreur non plus dans mon erase, quel test je peux faire pour savoir si mon iterateur est invalide au moment ou je fait le erase, ou si je fais une erreur?
je retire ce que j’ai dis :
j’ai le meme segmentation fault en faisant des erase(CC.begin())
donc ca ne vient pas de mon erase.
voici le bt :
#0 0xb7dc8c64 in free () from /lib/tls/i686/cmov/libc.so.6
#1 0xb7dca83f in malloc () from /lib/tls/i686/cmov/libc.so.6
#2 0xb7f7a4b7 in operator new () from /usr/lib/libstdc++.so.6
#3 0x0804b05a in __gnu_cxx::new_allocator<std::_List_node<int> >::allocate (this=0xbfea4eb4, __n=1)
at /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/ext/new_allocator.h:88
#4 0x0804b07d in std::_List_base<int, std::allocator<int> >::_M_get_node (this=0xbfea4eb4)
at /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_list.h:316
#5 0x0804b092 in std::list<int, std::allocator<int> >::_M_create_node (this=0xbfea4eb4, __x=@0xbfea4c54)
at /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_list.h:448
#6 0x0804b0f2 in std::list<int, std::allocator<int> >::_M_insert (this=0xbfea4eb4, __position={_M_node = 0xbfea4eb4}, __x=@0xbfea4c54)
at /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_list.h:1139
#7 0x08052722 in std::list<int, std::allocator<int> >::push_back (this=0xbfea4eb4, __x=@0xbfea4c54)
at /usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/stl_list.h:761
#8 0x08051132 in Graphe::addToCC (this=0xbfea4e94, v=107506) at Graphe.cc:201
#9 0x08051830 in Graphe::dijkstra (this=0xbfea4e94, vertex=0, distances=0xb7797008) at Graphe.cc:60
pourquoi il fait un free quand je fait un push_back?
Tu peux essayer avec autre chose que des entiers? Genre un objet avec un destructeur?
Mais bon, à mon avis tu es tombé sur une version moisie de la stl
(ceci dit, m’en sert pas des masses, mais mes erases ont toujours fonctionnés sur des listes, pour le peu que je me suis servi, en tout cas erase(begin()) marchait)
pourtant j’ai les llibraires fournis avec ma kubuntu donc ce sont les dernieres versions qui doivent marcher a peu pres bien…
Un truc encore plus bizarre : Je cree une nouvelle liste juste avant l’endroit ou j’ai l’erreur de segmentation et je lui fait un push_front d’un nombre et j’ai une erreur de segmentation sur cette nouvelle liste.
J’ai bien une distrib ubuntu sous VMWare. Je veux bien tester et regarder ça ce WE, car ça m’intrigue (et comme ça ça améliore mon C++ ))
A tout hasard, ton code semble venir d’un tout. As tu essayer de faire une test avec juste la liste d’entier et rien d’extérieur (de toi donc)?
Si jamais ça marche, alors j’arrêterai les recherches sur la stl : suppose que quelques part tu tape au mauvais endroit (exemple: tu prends l’adresse de la référence sur entier renvoyé, que tu décrémente de 1, et tu change la valeur => pan!).
Ca y est j’ai trouvé le problème.
Par contre je comprend pas pourquoi ca s’est manifesté lors de la manipulation de la liste.
Voila ce qu’il se passait :
Je cree un objet Graphe (dans lequel il y a ma liste), puis un tableau d’entier dynamique (avec l’operateur new). Et il se trouve qu’a l’execution du programme ce tableau etait de taille 3 alors qu’il etait censé etre beaucoup plus grand (je m’etait trompé de variable).
Ensuite je remplissai ce tableau avec des -1 pour l’initialiser. Et la ca ne posait pas de problème alors que je remplissai plus de 100k cases dans un tableau de 3 cases. Deja je comprends pas pourquoi j’ai pas eu de segmentation fault a ce moment la.
Et pourquoi je l’ai eu plus tard lors de l’execution de la classe graphe et de la manipulation de sa liste.
En plus, pour essayer de detecter ce genre d’erreur j’ai utilisé Valgrind, et il ne m’a rien detecté du tout…