pointeurs dans un conteneur - comment éviter leur destruction ?

pointeurs dans un conteneur - comment éviter leur destruction ? - C++ - Programmation

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
Reply

Marsh Posté le 15-06-2010 à 23:15:01   

Reply

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.

Reply

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  :fou: 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 :
  1. vector<Classe *> myVect;
  2. ... Remplissage de myVect
  3. for(vector<Classe *>::iterator it=myVect.begin(); it != myVect.end(); ++it)
  4. {
  5.     delete *it;*it=0;
  6. }


Non ?


---------------
Un blog qu'il est bien
Reply

Marsh Posté le 16-06-2010 à 20:42:51    

montre ton code de remplissage

 

et valgrind sinon :o

Message cité 1 fois
Message édité par Joel F le 16-06-2010 à 20:42:59
Reply

Marsh Posté le 16-06-2010 à 21:01:50    

Joel F a écrit :

montre ton code de remplissage
 
et valgrind sinon :o


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 :
  1. routingNetList::routingNetList(const routingNetList &other) : m_listNets(other.m_listNets), m_nbPairs(other.m_nbPairs)
  2.    {
  3.       if(m_listNets.size() > 0)
  4.       {
  5.          m_it = m_listNets.begin();
  6.          m_it2 = m_it->begin();
  7.          std::vector<std::vector<core::pinInfo> >::const_iterator itCp = other.m_listNets.begin();
  8.          for(std::vector<std::vector<core::pinInfo> >::const_iterator it = m_listNets.begin();
  9.             it != m_listNets.end(); ++it)
  10.          {
  11.             vector<route *> cp= other.m_InfosGroups.find(itCp)->second;
  12.             m_InfosGroups[it] = cp;
  13.             ++itCp;
  14.           }
  15.       }
  16.    }
  17. routingNetList::~routingNetList()
  18.    {
  19.       for(map<routingNetList::netlistIterator, vector<route *> >::iterator it = m_InfosGroups.begin();
  20.           it != m_InfosGroups.end(); ++it)
  21.       {
  22.          for(vector<route *>::iterator it2 = it->second.begin();
  23.             it2 != it->second.end(); ++it2)
  24.          {
  25.             delete *it2;   //NULL pointer is handled by C++ delete operator
  26.             *it2 = 0;
  27.          }
  28.       }
  29.    }


---------------
Un blog qu'il est bien
Reply

Marsh Posté le 16-06-2010 à 21:23:59    

faut pe resizer tes vector non ?

Reply

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.


Message édité par guepe le 16-06-2010 à 21:47:48

---------------
Un blog qu'il est bien
Reply

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)

Reply

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


Message édité par guepe le 16-06-2010 à 22:39:59

---------------
Un blog qu'il est bien
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed