Question

J'ai un pointeur sur un QScriptEngine que je passe à travers le constructeur de classe surchargé de la classe Evaluator et l'assigne à QScriptEngine * engine _ (class Property sous-classes Evaluator , et appelle ce constructeur de Evaluator , en lui transmettant un QScriptEngine déjà alloué). Le constructeur sans argument crée le nouveau pointeur QScriptEngine (classe Générique sous-classes Evaluator de cette manière). Dans le destructeur, je teste si engine _ n'est pas NULL , supprimez le pointeur, puis affectez-le NULL . Le pointeur ( engine _ ) dans la Propriété dérivée doit-il également être également NULL ? Quelque chose me dit que ce n'est pas le cas. Si non, comment gérez-vous cette situation? J'ai besoin que QScriptEngine soit toujours la même instance. L'opérateur = de QScriptEngine est privé, sinon j'éviterais le pointeur.

J'ai vu des informations sur les pointeurs partagés ( boost :: shared_ptr et std: tr1 :: shared_ptr ) dans une autre question SO. J'utilise déjà boost pour la bibliothèque regex, donc boost n'est pas hors de question si c'est la meilleure façon de gérer cela. Espérons qu’il existe une méthode non optimisée pour la connaissance générale du C ++ et les projets futurs.

Était-ce utile?

La solution

Vous pouvez résoudre ce problème en donnant à l’une des classes (classe A) le contrôle de la durée de vie de ce pointeur, ainsi qu’une méthode 'getter'. L'autre classe (classe B) appelle toujours le getter de A chaque fois qu'elle a besoin du pointeur. De cette façon, A garde le contrôle du pointeur à tout moment. L'inconvénient est la fonction getter (elle sera probablement en ligne, mais c'est toujours une seconde indirection). En outre, B devra vérifier ce pointeur pour la valeur NULL à chaque utilisation ou presque.

Vous pouvez également insérer le pointeur dans quelque chose comme boost :: shared_ptr, qui résout le problème (s'il est utilisé correctement) en maintenant le pointeur sous-jacent et en ne le supprimant que lorsque tous les objets partageant ce pointeur sont supprimés. Vous pouvez écrire cela vous-même, mais comme vous avez déjà un boost en jeu, je n’utiliserais que leur implémentation.

Un troisième choix consiste à re-factoriser le tout pour ne pas avoir besoin d’un pointeur partagé. Personnellement, je n’ai jamais conçu de programme C ++ nécessitant des pointeurs partagés, simplement parce que c’est un endroit où des problèmes de gestion de la mémoire pourraient facilement s’infiltrer au fil des années, mais ce n’est que moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top