vecteur de pointeur d’object – comment éviter les memory leaks?

Comment traitons-nous habituellement un vecteur dont les éléments sont des pointeurs sur des objects? Ma question spécifique est le commentaire à la fin du code fourni ci-dessous. Merci.

class A { public: virtual int play() = 0 ; }; class B : public A { public: int play() {cout << "play in B " << endl;}; }; class C : public A { public: int play() {cout << "play in C " << endl;}; }; int main() { vector l; l.push_back(new B()); l.push_back(new C()); for(int i = 0 ; i play(); } //Do i have to do this to avoid memory leak? It is akward. Any better way to do this? for(int i = 0 ; i < l.size();i++) { delete l[i]; } } 

Oui, vous devez le faire pour éviter les memory leaks. Les meilleures façons de le faire sont de créer un vecteur de pointeurs partagés ( boost , C ++ TR1, C ++ 0x,)

  std::vector > l; 

ou vecteur de pointeurs uniques (C ++ 0x) si les objects ne sont pas réellement partagés entre ce conteneur et quelque chose d’autre

  std::vector> l; 

ou utilisez des conteneurs de pointeur boost

  boost::ptr_vector l; 

PS: N’oubliez pas le destructeur virtuel de A, selon @Neil Butterworth!

Utilisez un tableau de shared_ptr, ou un pointeur intelligent similaire. Et notez que votre classe de base doit avoir un destructeur virtuel pour que ce code fonctionne correctement.

Le meilleur moyen serait d’utiliser des pointeurs intelligents ( Boost shared_ptr ) pour éviter ce genre de choses. Mais si vous avez BESOIN d’avoir des indicateurs bruts, je pense que c’est la meilleure façon de le faire.