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.