2012-08-25 4 views
1
class X; 

class Y { 
    public: 
     ~Y(); 
    private: 
     map<int,X*> m; 
     vector<X*> v; 
     X* px; 
}; 

Je suppose que le destructor pour class Y devrait ressembler à quelque chose comme ça?et cartes Destructeurs

Y::~Y() { 
    delete px; 
    for (vector<X*>::iterator it = v.begin(); it!=v.end(); it++) 
    delete *it; 
    v.clear(); 
} 

Mais qu'en est-il de Y::m?

Répondre

4

Quant au vecteur, mais la carte ...

for (map<int, X*>::iterator it = m.begin(); it != m.end(); ++it) 
    delete it->second; 
+0

@OP: faites attention au pré-incrément. Il est préférable d'utiliser le pré-incrément avec les itérateurs comme vous voyez ici – xQuare

+0

Oh, mon ... Je n'ai même pas pensé que les cartes aient des itérateurs. Désolé pour le dérangement. Merci. – scarably

0

même:

for (map<int,X*>::iterator it = m.begin() ; it != m.end() ; it++) 
    delete it->second; 

En C++ 11 vous pouvez utiliser auto sauter le type iterator. Il est également inutile d'appeler le v.clear(); dans le destructeur.

17

Non, c'est complètement faux. Vous avez supprimé manuellement vos ressources au lieu d'utiliser une classe de gestion de ressources. C'est une très mauvaise erreur. Vous voulez vraiment unique_ptr<X> ou shared_ptr<X> ou une classe similaire, au lieu de , si vous êtes responsable de les libérer.

class Y { 
    private: 
     map<int,std::unique_ptr<X>> m; 
     vector<std::unique_ptr<X>> v; 
     std::unique_ptr<X> px; 
}; 

Désormais, aucun destructeur personnalisé n'est requis.

+0

Cette réponse a besoin de plus de votes upvotes. –

+0

Je ne vous ai pas downvote mais l'appeler complètement faux est faux, même si votre conseil est bon +1 :) –

+0

Je ne sais pas, pourquoi les pouces vers le bas, c'est la définition d'être constructif. –