OVH Cloud OVH Cloud

Singletons

9 réponses
Avatar
Vincent Jacques
Bonsoir à tous,

dans une classe Singleton implémentée avec un membre statique Singleton*
m_Instance et une fonction membre statique Singleton* GetInstance() qui
crée le Singleton (avec un new) lors de son premier appel, qui doit avoir
la responsabilité de delete le singleton ?

Merci,
--
Vincent Jacques

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème."
Devise Shadok

9 réponses

Avatar
Fabien LE LEZ
On Wed, 28 Jun 2006 19:55:48 +0200, Vincent Jacques
:

qui doit avoir
la responsabilité de delete le singleton ?


Typiquement, personne. L'objet n'est jamais détruit ; la mémoire est
libérée par l'OS à la sortie du programme.

Avatar
Michael
Fabien LE LEZ wrote in
news::

On Wed, 28 Jun 2006 19:55:48 +0200, Vincent Jacques
:

qui doit avoir
la responsabilité de delete le singleton ?


Typiquement, personne. L'objet n'est jamais détruit ; la mémoire est
libérée par l'OS à la sortie du programme.




Néanmoins il existe des solutions, dont une développée par Alexandrescu dans
son bouquin sur les patterns, via la fonction std::atexit si j'ai bonne
mémoire


Avatar
Hamiral
Michael <michael.at.gmail.dot.com> wrote:
Typiquement, personne. L'objet n'est jamais détruit ; la mémoire est
libérée par l'OS à la sortie du programme.


Néanmoins il existe des solutions, dont une développée par Alexandrescu
dans son bouquin sur les patterns, via la fonction std::atexit si j'ai
bonne mémoire


Cet article trouvé sur le net, peut éventuellement être utile :
http://flure.free.fr/dotclear/index.php?2006/04/21/6-static-pimpl-singleton

--
Hamiral


Avatar
Vincent Jacques
Merci à tous les trois pour vos réponses.

Hamiral wrote:
http://flure.free.fr/dotclear/index.php?2006/04/21/6-static-pimpl-singleton


Tiens, une erreur 503, pas courant, ça.

Bonne journée,
--
Vincent Jacques

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème."
Devise Shadok

Avatar
kanze
Vincent Jacques wrote:

dans une classe Singleton implémentée avec un membre statique
Singleton* m_Instance et une fonction membre statique
Singleton* GetInstance() qui crée le Singleton (avec un new)
lors de son premier appel, qui doit avoir la responsabilité de
delete le singleton ?


Typiquement, personne. On ne veut pas qu'il soit détruit, afin
d'être sûr que personne s'en serve après sa destruction (dans le
destructeur d'un objet statique, par exemple).

Si ça ne gène pas qu'il soit détruit, la solution classique,
c'est de ne pas utiliser de pointeur, et de le déclarer comme
variable statique locale :

Singleton&
Singleton::instance()
{
static Singleton theOneAndOnly ;
return theOneAndOnly ;
}

Du coup, c'est le compilateur qui s'occupe de sa destruction.
(Mais attention aux problèmes de thread avec cette solution.)

Sinon, affecter le pointeur à un auto_ptr (ou un
boost::shared_ptr) fait aussi l'affaire.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Hamiral
Vincent Jacques wrote:

http://flure.free.fr/dotclear/index.php?2006/04/21/6-static-pimpl-singleton



Tiens, une erreur 503, pas courant, ça.


Effectivement ! Ça marchait avant que je poste, puis ça ne marchait plus.
Mais il semblerait que tout soit rentré dans l'ordre maintenant ...

--
Hamiral


Avatar
Vincent Jacques
Hamiral wrote:
Vincent Jacques wrote:
http://flure.free.fr/dotclear/index.php?2006/04/21/6-static-pimpl-singleton
Tiens, une erreur 503, pas courant, ça.


Effectivement ! Ça marchait avant que je poste, puis ça ne marchait plus.
Mais il semblerait que tout soit rentré dans l'ordre maintenant ...


Vi. Pas mal, cet article, merci,
--
Vincent Jacques

"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème."
Devise Shadok


Avatar
kanze
Vincent Jacques wrote:
Hamiral wrote:
Vincent Jacques wrote:
http://flure.free.fr/dotclear/index.php?2006/04/21/6-static-pimpl-singl eton
Tiens, une erreur 503, pas courant, ça.


Effectivement ! Ça marchait avant que je poste, puis ça ne
marchait plus. Mais il semblerait que tout soit rentré dans
l'ordre maintenant ...


Vi. Pas mal, cet article, merci,


Si je ne me trompe pas, ça correspond à peu près à comment
j'implémentais les singletons avant le livre des « Design
Patterns ». Sauf que je n'utilisais pas de compteur de
référence (et je ne detruisait jamais l'objet même).

Un des principes fondamentaux d'un singleton, c'est qu'il n'est
créé qu'une fois, et qu'il existe alors jusqu'à la fin du
programme. Ce n'est pas le cas de la solution proposée dans
l'article, où son objet (réel) risque d'être créé et detruit
souvent. Prenons, par exemple, une des utilisations fréquentes
d'un singleton, c'est pour la configuration -- avec la solution
proposée, on va probablement créer l'objet une première fois
pour lire le fichier de configuration, puis le détruire, puis le
créer de nouveau quand on veut lire la configuration.

En somme, c'est bien beau, mais ce n'est pas un singleton.

Aussi : avant le livre, on se servait bien de mes singletons en
en définissant une instance. J'utilisais effectivement une
variante de l'idiome pimpl, mais avec un pointeur static, et le
constructeur qui ne construisait l'objet d'implémentation que si
c'était nul. J'ai changé surtout parce que personne ne connaît
mon idiome, tandis que dès qu'on voit une classe avec une
fonction statique « instance() » et pas de constructeurs
publics, on reconnaît un singleton. Et si c'est un peu plus
verbieux que ce que je faisais avant, c'est plus
« honnête » ; on ne construit pas des « instances » qui
n'en sont pas dans les faits.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34



Avatar
kUfa
Comme cite plus haut, je conseille le bouquin "Modern C++ Design"
d'Andrei Alexandrescu et les articles associes (il y en a pas mal).
Loki (sur sourceforge) possede ses singletons, qui sont tres utiles
(sachant que l'ordre de destruction des singletons peut etre defini),
enfin a mon avis. Le code n'est pas si difficile a comprendre si tu
maitrise les templates.

/k