Aide smart pointers et STL - C++ - Programmation
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.
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.
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...
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 ?
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
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
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
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 );
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"
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
Sinon, euh, j'suis d'accord avec bjone
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