51 votes

Nettoyer une liste STL / vecteur de pointeurs

Quel est le plus petit morceau de C ++ que vous pouvez créer pour nettoyer en toute sécurité un vecteur ou une liste de pointeurs? (en supposant que vous deviez appeler delete sur les pointeurs?)

 list<Foo*> foo_list;
 

Je préfère ne pas utiliser Boost ou envelopper mes pointeurs avec des pointeurs intelligents.

56voto

Pour std::list<T*> usage:

 while(!foo.empty()) delete foo.front(), foo.pop_front();
 

Pour std::vector<T*> usage:

 while(!bar.empty()) delete bar.back(), bar.pop_back();
 

Je ne sais pas pourquoi j'ai pris front au lieu de back pour std::list ci-dessus. Je suppose que c'est le sentiment que c'est plus rapide. Mais en réalité, les deux sont du temps constant :). Quoi qu'il en soit, envelopper une fonction et amusez-vous:

 template<typename Container>
void delete_them(Container& c) { while(!c.empty()) delete c.back(), c.pop_back(); }
 

51voto

Mr.Ree Points 5112

Puisque nous jetons le gant ici ... "Le plus petit morceau de C ++"

 static bool deleteAll( Foo * theElement ) { delete theElement; return true; }

foo_list . remove_if ( deleteAll );
 

Je pense que nous pouvons faire confiance aux personnes qui ont mis au point STL pour avoir des algorithmes efficaces. Pourquoi réinventer la roue?

31voto

Douglas Leeder Points 29986
for(list<Foo*>::const_iterator it = foo_list.begin(); it != foo_list.end(); it++)
{
    delete *it;
} 
foo_list.clear();

17voto

Adisak Points 3328

Si vous autorisez C ++11, vous pouvez créer une version très courte de la réponse de Douglas Leeder:

 for(auto &it:foo_list) delete it; foo_list.clear();
 

13voto

Mark Ransom Points 132545

Il est très dangereux de s’appuyer sur du code situé en dehors du conteneur pour supprimer vos pointeurs. Que se passe-t-il lorsque le conteneur est détruit en raison d'une exception levée, par exemple?

Je sais que vous avez dit que vous n'aimiez pas le boost, mais pensez aux conteneurs de pointeur de boost

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X