Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2426 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  pointeurs dans un conteneur - comment éviter leur destruction ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

pointeurs dans un conteneur - comment éviter leur destruction ?

n°2001979
guepe
J'ai du noir sur la truffe ?
Posté le 15-06-2010 à 23:15:01  profilanswer
 

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
mood
Publicité
Posté le 15-06-2010 à 23:15:01  profilanswer
 

n°2002006
Joel F
Real men use unique_ptr
Posté le 16-06-2010 à 07:58:06  profilanswer
 

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.

n°2002310
guepe
J'ai du noir sur la truffe ?
Posté le 16-06-2010 à 17:31:39  profilanswer
 

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
n°2002346
Joel F
Real men use unique_ptr
Posté le 16-06-2010 à 20:42:51  profilanswer
 

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
n°2002352
guepe
J'ai du noir sur la truffe ?
Posté le 16-06-2010 à 21:01:50  profilanswer
 

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
n°2002358
Joel F
Real men use unique_ptr
Posté le 16-06-2010 à 21:23:59  profilanswer
 

faut pe resizer tes vector non ?

n°2002363
guepe
J'ai du noir sur la truffe ?
Posté le 16-06-2010 à 21:46:32  profilanswer
 

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
n°2002370
Joel F
Real men use unique_ptr
Posté le 16-06-2010 à 22:24:17  profilanswer
 

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)

n°2002372
guepe
J'ai du noir sur la truffe ?
Posté le 16-06-2010 à 22:31:19  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  pointeurs dans un conteneur - comment éviter leur destruction ?

 

Sujets relatifs
Passage d'un tableau de pointeurs de fonctions en argument[resolut]
Eviter rechargement animation .swf lors de navigationQuel conteneur pour mon problème ?
[PHP] Faut-il eviter de "boucler" si possible ?Eviter les Injections mysql
[résolu] eviter blocage navigateur lors de recherche de villetableaux de pointeurs
Structures, pointeurs..affichage?Cas où les références remplacent mal les pointeurs ?
Plus de sujets relatifs à : pointeurs dans un conteneur - comment éviter leur destruction ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR