2009-10-06 8 views
3

Supposons que j'ai ce code ...C++ - quand les membres de classe non-pointers sont-ils détruits?

class GraphFactory : public QObject 
{ 
private: 
    QMap<QString, IGraphCreator*> factory_; 

public: 
    virtual ~GraphFactory(); 
}; 

GraphFactory::~GraphFactory() 
{ 
    // Free up the graph creators 
    QMap<QString, IGraphCreator*>::iterator itr; 
    for (itr = factory_.begin(); itr != factory_.end(); itr++) 
    { 
     IGraphCreator * creator = itr.value(); 
     delete creator; 
     creator = NULL; 
    } 

} 

Quand est-ce le QMap factory_ détruit? Avant l'appel au destructeur, ou pendant le destructeur? (Je comprends que la destructor sera appelée lorsqu'une instance de GraphFactory est hors de portée Mais quand sont les membres non-pointeurs détruisais.?)

Edit: Je reçois des valeurs non valides pour la carte de factory_ lorsqu'il atteint le destructeur. Un point de rupture montre que la valeur n'aurait pas altéré la valeur stockée dans le QMap.

+3

Vous devriez toujours pré-incrémenter les itérateurs: ++ itr. Cela n'a pas d'importance pour les entiers et les types d'itérateurs les plus simples, comme pour vector <>, mais cela peut être une sève de performance pour les itérateurs complexes, en raison de la différence de fonctionnement de ++. –

Répondre

11

Ce sera DESTRUCTED après le code destructor est exécuté

L'idée est d'avoir accès à vos membres dans le code destructor afin qu'ils sont détruits après, il est exécuté.

2

Après GraphFactory::~GraphFactory, mais avant QObject::~QObject. Donc, en fait, entre les destructeurs.

1

Si les données stockées dans GraphFactory :: factory_ member ne sont pas valides lors de l'appel de votre destructeur, cela peut se produire de plusieurs façons, par exemple. Un double gratuit de votre instance GraphFactory, ou peut-être quelque chose l'écrase par erreur. Si vous utilisez Windows, des outils tels que Application Verifier peuvent être très utiles lors du débogage de ce type de problème (utilisez-le pour activer la fonction Page Heap et attacher un débogueur lors de la reproduction du problème).

Si vous utilisez votre classe GraphFactory dans un environnement multithread, vous devez synchroniser l'accès à l'instance QMap car des "erreurs" peuvent se produire si vous ne le faites pas.

Je ne connais pas d'outils équivalents pour d'autres plates-formes. J'aimerais entendre parler d'eux si quelqu'un qui lit ceci sait.

Questions connexes