pointeurs dans un conteneur - comment éviter leur destruction ? - C++ - Programmation
Marsh Posté le 16-06-2010 à 07:58:06
si t'as un std::vector<Toto*>, jamais les Toto* ne sont jamais détruit tout seul hein, c'est à ta charge. Je pense que tu dois te vautrer qq part.
Marsh Posté le 16-06-2010 à 17:31:39
Joel F a écrit : si t'as un std::vector<Toto*>, jamais les Toto* ne sont jamais détruit tout seul hein, c'est à ta charge. Je pense que tu dois te vautrer qq part. |
J'ai écris cela hier soir après une dure après-midi de traçage de memory leaks Et ce matin je pensais que justement ce ne pouvais pas être le problème, le comportement ne peut être expliqué par cela.
Grrrr… C'est du c++, existe-t-il un moyen de tracker les deletes effectués sur un pointeur particulier (Linux, et gratuit - université inside) ??
Je vais laisser cela de coté et reprendre plus tard, mais tous mes delete sont suivis d'une mise à 0 du pointeur derrière, donc il doit en trainer qq part que j'ai manqués ??
D'ailleurs à priori (je commence à douter de tout) ceci est parfaitement valide :
Code :
|
Non ?
Marsh Posté le 16-06-2010 à 20:42:51
montre ton code de remplissage
et valgrind sinon
Marsh Posté le 16-06-2010 à 21:01:50
Joel F a écrit : montre ton code de remplissage |
j'utilise valgrind ; mais meme le callgrind me fournit pas tout à fait ce que je veux…
J'ai l'impression que c'est un probrème de constructeur de copie / multiple delete. J'ai passé certaines fonctions qui prenaient mon objet fautif par copie pour les passer par référence,et j'ai plus ce problème.
Cependant mon constructeur de copie ne copie que les pointeurs, et mon destructeur remet à 0 chaque pointeur, il ne devrait pas y avoir de multiple delete … ??
Code :
|
Marsh Posté le 16-06-2010 à 21:46:32
Joel F a écrit : faut pe resizer tes vector non ? |
Dans le destructeur, si je delete les objets, on s'en fiche de faire un clear du vecteur non ? Ok, si deux objets routingNetlist ont les meme pointeur, le deuxième objet détruit va boucler pour pas grand-chose ; cependant les pointeurs étant à null, ça devrait pas crasher…
[edit] m_InfosGroup est une map par contre, la clef est un iterateur, la valeur un vector de pointeurs.
Marsh Posté le 16-06-2010 à 22:24:17
sauf que gaffe que tes itérator dans ta map deviennent invalide si tu modifie le contenur ciblé en dehors.
Compile avec les iterateur de debug (façon http://msdn.microsoft.com/en-us/li [...] 0%29.aspx)
Marsh Posté le 16-06-2010 à 22:31:19
Joel F a écrit : sauf que gaffe que tes itérator dans ta map deviennent invalide si tu modifie le contenur ciblé en dehors. Compile avec les iterateur de debug (façon http://msdn.microsoft.com/en-us/li [...] 0%29.aspx) |
Oui bon point pour les iterateurs, mais à priori c'est très statique (insertion au début, ensuite on y touche pas).
Très intéressant l'idée des iterateurs de debug, je vais regarder.
[edit]_Yeah, erreur dans le constructeur de copie (bien que je ne sais pas encore pourquoi, au moins je vais pouvoir y voir clair !
Et bien merci beaucoup.
Pour gcc et les iterateurs en mode debug, c'est ici : http://gcc.gnu.org/onlinedocs/libs [...] using.mode
Simplement compiler avec le flag -D_GLIBCXX_DEBUG
Marsh Posté le 15-06-2010 à 23:15:01
Lorsque l'on utilise des conteneurs de la stl, par exemple un vector de pointeurs, à la destruction du conteneur les objets pointés sont détruits (destructor appelé).
Bien qu'il soit possible d'utiliser boost::shared_ptr pour éviter la destruction de ces objets, c'est assez lent (j'en ai en tous les cas eu une mauvaise expérience). Y'a-t-il une solution plus légère, qui me permettrait de préciser que les pointeurs dans un conteneur ne doivent pas être détruits ?
Merci.
---------------
Un blog qu'il est bien