web-dev-qa-db-fra.com

quel est l'intérêt de std :: unique_ptr :: get

std::unique_ptr::get ne va-t-il pas à l'encontre du but qui consiste à avoir un unique_ptr en premier lieu? ::obtenir?

43
lezebulon

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 );
55
Nikolai Fetissov

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.

37
bames53

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.

24
Nevin

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.

14

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.

4
Mikael

Il est évident que vous devez appeler une API C ou une API C++ mal conçue.

0
K-ballo