destruction d'un Singleton Pattern : Static ou non Static
Le
requinham
Bonjour,
je parlais avec un amis sur la declaration de la fonction qui se
chargera de la destruction de notre instance unique destroy()
en fait est ce que c'est nécessaire de la déclarer static au niveau
conceptuel. car au niveau codage elle ne dérange pas vue qu'elle sera
la dernière à s'exécuter donc elle retournera la main à un autre ob=
jet
ou fonction différente de l'instance ?
A votre avis comment ça se fait ?
je parlais avec un amis sur la declaration de la fonction qui se
chargera de la destruction de notre instance unique destroy()
en fait est ce que c'est nécessaire de la déclarer static au niveau
conceptuel. car au niveau codage elle ne dérange pas vue qu'elle sera
la dernière à s'exécuter donc elle retournera la main à un autre ob=
jet
ou fonction différente de l'instance ?
A votre avis comment ça se fait ?

Poser une question


A vrai dire, le fait de la déclarer static n'a pas de sens car pouvoir
fair un appel statique à destroy n'aura pas de sens tant qu'il n'y a
pas de singleton en memoire et dans le cas où il y en a on peut
l'appeler à partir du singleton exple : A::getInstance()->destroy()
sans problème vue que c'est la derniere instruction appelé dans la vie
du singleton.
Oui, sinon on risque de se poser des questions sur le pourquoi de ce
fonctionnement.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Ta question laisse supposer que tu vas appeler toi même la fonction de
destruction du singleton.
AMHA il vaut mieux un traitement générique de la durée de vie du
singleton C'est à dire qu'un singleton hérite d'une interface avec une
fonction membre virtual void destroy(); et qu'une fonction de netoyage
soit en charge de l'appeler au moment de la fin de vie.
Cette solution de permet de distinguer les types de singleton et leur
durée de vie associée à un évènement:
- détruit par le système (pas enregistré auprès d'un gestionnaire de
singleton)
- détruit explicitment à l'exit ou en sortie de scope
- détruit à la sortie d'un thread (pour les singletons TSS)
- détruit quand une dll est déchargée
- ...
Déjà, une fonction de destruction en sortie de programme ( avec
at_exit() ) devrait couvrir la plupart des cas courants et t'évitera
d'avoir à te creuser la tête pour svaoir quand appeler destroy().
Le mieux reste quand même de laisser le système réclamer les
ressources - si c'est possible.
--
Michael
bon si on a un cas dans lequel on devra détruire à la main le
singleton au milieu d'exécution du programme. Par exemple si on a un
GUI comportant plusieurs fonctionnalité parmi lesquelles une qui prend
un nom de fichier et appelle une dll pour le parser charger au fur et
à mesur ses données dans des structures spécifiques et mets ces
dernières à la disposition d'autres fonctionnalité. dans le cas ou je
veux changer le fichier je détruit le singleton (initialement créer
par le dll) et re-crée un autre pour le nouveau fichier.
Bon ça reste à titre d'exemple, mais la question est doit on déclarer
la fonction destroy() static ou non, conceptuellement parlant biensûr.
Merci
Que normalement, on ne detruit pas un singleton. Le detruire
laisse la porte ouverte aux problèmes d'ordre de destruction.
Si on veut le detruire, il suffit que l'instance même soit
static, et le compilateur s'en occupera.
--
James Kanze