Aide smart pointers et STL

Aide smart pointers et STL - C++ - Programmation

Marsh Posté le 09-09-2005 à 15:51:19    

Bonjour,
j'ai un problème de libération de mémoire et apparemment, les smarts pointeurs pourraient le résoudre. Seulement, j'auria besoin d'un peu d'aide. Voici le code d'une fonction que je voudrais appeler souvent :
void foo() {
std:vector<BaseClasse*> v;
for (int i=0;i<1000;i++)
v.push_back(new BaseClasse());
 
for (int i=0;i<1000;i++)
delete v[i];
 
v.clear();
}
 
J'ai l'impression qu'une partie de la mémoire n'a pas été libérée (je voudrais qu'en sortie de fonction, il n'y ait plus rien en mémoire de ce qui y a été créé). Y a-t-il un bogue ?
Comment faire pour utiliser des smarts pointeurs comme auto_ptr ?
 
Sam

Reply

Marsh Posté le 09-09-2005 à 15:51:19   

Reply

Marsh Posté le 09-09-2005 à 19:59:52    

Si j'en crois http://www.sgi.com/tech/stl/Sequence.html, tu peux te passer du for(...) delete ..., v.clear() fait la même chose.
Les auto_ptr et les conteneurs ne font pas trop bon ménage(sauf version boost)
 
Sinon, il vaut mieux faire un  
vsize=1000;  
v.resize(vsize);  
et ensuite n'utiliser que des iterator et des v.begin(); v.end(); plutôt que de se trimballer la taille dans toutes les boucles. C'est plus sûr et plus propre.


Message édité par el muchacho le 09-09-2005 à 20:02:07
Reply

Marsh Posté le 14-09-2005 à 15:11:24    

muchacho : je ne pense pas que clear fasse le delete à sa place.
sam : ton code me semble bon. Tu fais 1000 new puis 1000 delete, il n'y a pas de fuite.
 
[edit]
il peut y avoir une fuite avec ta classe BaseClasse. Genre un new dans le constructeur abscent du destructeur. Dans ton extrait de code je ne vois pas de pb. Ne fait pas de vector<auto_ptr> ça marche très mal, les auto_ptr ne sont pas fait pour ça.


Message édité par jesus_christ le 14-09-2005 à 15:14:03
Reply

Marsh Posté le 14-09-2005 à 20:57:07    

Ben sur la doc SGI, il est indiqué:
 
a.clear()     Equivalent to a.erase(a.begin(), a.end())
a.erase(p,q)          Destroys the elements in the range [p,q) and removes them from a
a.erase(p)            Destroys the element pointed to by p and removes it from a.
 
Après, je ferais un essai pour m'assurer de la réalité de ceci, mais la doc semble assez claire sur ce point.
 
edit: en fait, tout bien réfléchi, non, elle n'est pas si claire que ça, sachant que p est un itérateur...


Message édité par el muchacho le 14-09-2005 à 21:00:09
Reply

Marsh Posté le 14-09-2005 à 20:59:15    

"pointed to" c'est pour l'itérateur. Donc ça supprimme ce vers quoi l'itérateur pointe. Si l'itérateur pointe vers un pointeur "à la C" truc*, ça supprime le pointeur, ça ne fait pas de delete dessus.
 
Et si tes pointeurs étaient des pointeurs de fonction, ça ferait quoi ?

Reply

Marsh Posté le 14-09-2005 à 21:00:32    

oui, c'est ce que je viens de me dire.

Reply

Marsh Posté le 14-09-2005 à 21:05:23    

Au temps pour moi, c'eût été trop beau.

Reply

Marsh Posté le 14-09-2005 à 21:07:50    

rien que parce que tu as écrit "Au temps" correctement (et pas "autant", même si c'est + logique), j'absous ta faute ;)

Reply

Marsh Posté le 14-09-2005 à 21:30:36    

Alléluia !!

Reply

Marsh Posté le 15-09-2005 à 11:53:51    

jesus_christ a écrit :

rien que parce que tu as écrit "Au temps" correctement (et pas "autant", même si c'est + logique), j'absous ta faute ;)


Pas de bol, les deux orthographes sont correctes :D

Reply

Marsh Posté le 15-09-2005 à 11:53:51   

Reply

Marsh Posté le 15-09-2005 à 12:02:44    

ouais c'est encore l'académie française qui joue les tolérantes, comme avec "malgré que". Bientôt même le langage SMS sera correct :(

Reply

Marsh Posté le 15-09-2005 à 12:08:05    

à froid:
 
class MaClasse;
 
std::vector< boost::shared_ptr<MaClasse> > MaCollection;
 
je dirais: MaCollection.push_back( new MaClasse );
 

Reply

Marsh Posté le 15-09-2005 à 12:14:52    

jesus_christ a écrit :

ouais c'est encore l'académie française qui joue les tolérantes, comme avec "malgré que". Bientôt même le langage SMS sera correct :(


Tu parles de l'utilisation du "malgrè que" seulement avec le verbe avoir ?
 
Enfin il y a quand même une grande différence entre du "Au temps/Autant pour moi" et du "Otan pr mwa" :D
J'trouve que c'est largement tolérable. Comme le coup du "Après que je sois parti" qu'on utilise au lieu de "Après que je suis parti", c'est assez minime quand même [:ocube]
 
Sinon, euh, j'suis d'accord avec bjone :D

Reply

Sujets relatifs:

Leave a Replay

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