Je trouve que ces 2 derniers points sont incomplets.
A mon avis :
- un seul propriétaire et un seul observateur (le propriétaire) ==> unique_ptr
- plusieurs propriétaire OU pluisuers observateur ==> shared_ptr
Par défaut, on doit considérer que l'on est en multithreads (soit parce que c'est effectivement le cas, soit parce que rien n'interdit dans le design que ça ne sera pas le cas dans le futur). Dans cette situation, avec unique_ptr, pour avoir un observateur, on peut passer :
- par un pointeur nu ==> impossible de vérifier si l'objet est détruit ou non
- une référence ou un équivalent de weak_ptr ==> impossible de garantir que l'objet n'est pas détruit entre le moment où l'on teste la validité de l'objet et le moment où on l'utilise
Dans les 2 cas, le design est problématique
Le seul moyen sécurisé d'avoir plusieurs observateurs est d'utiliser shared_ptr/weak_ptr. Le premier est utilisé pour avoir plusieurs propriétaire de la ressource (situation qui devrait reste rare), le second pour avoir plusieurs observateurs sur la ressource. Lorsqu'un observateur souhaite utiliser la ressource, il doit localement promouvoir le weak_ptr en shared_ptr (et dans ce cas, le shared_ptr est détruit à la fin du bloc, l'observateur est juste un propriétaire temporaire)
Donc à mon sens, le cas 4 correspond à unique_ptr si pas d'autre observateur que le propriétaire ou shared_ptr/weak_ptr s'il y a plusieurs observateurs
Partager