Bonjour.
Encore un petit problème de conception...

Je dispose d'objets (polymorphiques ou non) à sémantique d'entité, utilisés un peu partout dans le programme.
Ces objets sont lus à partir d'un fichier, et associés à une clé pour pouvoir les récupérer facilement.

Jusqu'ici, ils étaient stockés dans des conteneurs, et utilisés dans le programme à l'aide de pointeurs.
Ils étaient créés par une simili-fabrique, et détruits à la fin du programme en vidant les conteneurs.
Histoire d'améliorer un peu tout ça, je compte utiliser des pointeurs intelligents afin de les détruire automatiquement (et faire de vraies fabriques).
Logiquement, je suis parti sur quelque chose qui conserve un peu la structure : les objets sont stockée dans le conteneurs via des std::unique_ptr, et on les utilises dans le programme via des références/std::reference_wrapper.

Mais après tout, même si ces objets sont « unique », ils sont « partagés » entre plusieurs modules du programme.
std::shared_ptr serait donc peut-être plus cohérent.
Alors on stocke via des std::shared_ptr, et on utilise via des std::weak_ptr.

À la réflexion, ce n'est peut-être pas utile d'avoir un seul std::shared_ptr par objet.
Et puis comme ils sont « partagés », il n'y a pas vraiment de raison de les stocker à un endroit particulier.
De plus, si un objet n'est plus utilisé, il sera directement détruit, et non plus stocké pour rien.
Mais du coup, dans mes tables, à quoi associer les clés ?
Pour que ce soit efficace, il faut créer un nouveau std::shared_ptr à partir d'un std::shared_ptr existant.
Donc au final, je serai tout de même obligé de stocker mes objets dans des conteneurs...

Bref, voici le déroulement de mon raisonnement, pour arriver la question du titre :
  • std::unique_ptr + référence/std::reference_wrapper ou
  • std::shared_ptr + std::weak_ptr ou
  • std::shared_ptr uniquement.


Je me doute bien que vous ne pourrez pas me répondre sans avoir des informations précises sur mon projet.
Alors ce que j'aimerais surtout savoir, c'est à quoi je dois réfléchir et ce que je dois prendre en compte pour faire mon choix.

Voilà.
Merci d'avance.