std::unique_ptr::get
ne va-t-il pas à l'encontre du but qui consiste à avoir un unique_ptr en premier lieu? ::obtenir?
Vous l'utilisez chaque fois que vous devez passer un pointeur brut à, par exemple, une fonction C:
std::unique_ptr<char[]> buffer( new char[1024] );
// ... fill the buffer
int rc = ::write( fd, buffer.get(), len );
std::unique_ptr
fournit une sémantique de propriété unique en toute sécurité. Cependant, cela n'exclut pas la nécessité de ne pas posséder pointeurs. std::shared_ptr
a une contrepartie non propriétaire, std::weak_ptr
. Les pointeurs bruts fonctionnent comme la contrepartie non propriétaire de std::unique_ptr
.
La règle que j’ai tendance à suivre est la suivante: si l’appelé n’abandonne pas la propriété à vie, ne lui transmettez pas un indicateur intelligent; transmettez plutôt une référence C++ brute (de préférence) ou un pointeur brut. Je trouve qu'il est beaucoup plus propre et plus souple de séparer le problème de la propriété de l'usage.
Lorsque vos mains sont liées et que vous devez passer un pointeur sur quelque chose, p.get()
se lit mieux que &*p
.
Il y a une fonction qui change l'état de sorte que le unique_ptr
ne détienne plus de pointeur, qui s'appelle release
. Cela est surtout utile pour transférer la propriété à d'autres pointeurs intelligents qui ne fournissent pas de construction directe à partir d'un unique_ptr
. Toute autre utilisation risque de provoquer une fuite de la ressource.
Herb Sutter a une bonne explication (environ 3:40) https://www.youtube.com/watch?v=JfmTagWcqoE
Le principal avantage est que le pointeur unique enregistre le nombre de références à ce pointeur. Vous travaillez uniquement avec le pointeur unique lorsque vous travaillez avec la propriété. Lorsque vous voulez utiliser quelque chose avec les données avec ce pointeur, vous passez le pointeur brut.
Il est évident que vous devez appeler une API C ou une API C++ mal conçue.