Pour ma part, et je sais que je vais en surprendre plus d'un, je ne vois pas d'intérêt à vouloir absolument que le singleton soit détruit à un moment quelconque du programme (y compris une fois que main() a fini de s'exécuter). Nous sommes dans un monde simplifié, ou l'OS prends en charge l'unload do process et termine toutes les ressources allouées par ce process. De fait, la mémoire, les fichiers ouverts, etc sont correctement libéré/fermé/etc à la fin du programme.
Certes, on peut toujours me répondre "ça fait un resource leak ! ". Et bien non: puisque le singleton est censé être valide à partir du moment ou il est instancié et jusqu'à la fin du programme (c'est à dire, dans un sens, jusqu'à ce que le dernier destructeur de la dernière instance qui a une durée de vie statique ait fini de s'exécuter), quel leak est-ce que je crée si je ne le libère pas en quittant ? Aucun, puisque sitôt après l'exécution du destructeur du singleton, on est censé redonner la main à l'OS pour qu'il fasse le clean up.
En fait, si on donne à l'utilisateur la possibilité de détruire le singleton quand il le souhaite, on prends le risque de l'autoriser à l'utiliser après qu'il ait été détruit - ce qui est bien plus ennuyeux que de ne pas le détruire au niveau de la maintenance du code.
J'en entends déjà qui me hurlent "mais un utilisateur lambda ne ferais pas ça!". Certes. C'est possible. Le même utilisateur lambda ne déclarera pas deux instances de la même classe si vous lui dites qu'il n'en a pas le droit. Puisque vous vous substituez à son intelligence en interdisant la création d'une seconde instance de votre classe, pourquoi lui permettre de la détruire après ? Ca n'est pas très consistant

Partager