
Envoyé par
JolyLoic
Juste une réponse en passant sur un point. Autant pour un shared_ptr, accéder au pointeur contenu ne doit avoir lieu que pour de l'interfaçage avec du vieux code, autant pour un unique_ptr, je pense que ça peut intervenir plus souvent.
En effet, côté shared, on a un couple shared_ptr/weak_ptr. Côté unique, le même couple s'écrit aujourd'hui unique_ptr/T* (et je n'ai pas réussi à vraiment convaincre les gens qu'une telle écriture n'est pas idéale).
Il y a donc, en collaboration avec unique_ptr la possibilité tout à fait légitime et justifiée d'avoir des T* qui représentent des pointeurs n'influençant pas la durée de vie de l'objet pointé, et agissant en simples observateurs de l'unique_ptr (il faut bien entendu que l'architecture du programme permette de s'assurer que ce dernier restera vivant tant que l'observateur peut être utilisé). Et le moyen d'obtenir un T* à partir d'un unique_ptr, c'est justement get.
Je pense que la règle à la louche n'est donc pas de faire attention aux get, ni aux pointeurs nus. Mais de faire attention aux delete. Un delete dans du code moderne, sauf s'il est dans l'implémentation d'un wrapper type smart pointer, et probablement un code smell. Pourquoi doit-on le faire manuellement, et ne risque-t-on pas de marcher sur les plates-bandes d'un autre mécanisme de gestion de la mémoire.
Partager