La bibliothèque standard C ++ 11 fournit-elle un utilitaire pour convertir de a std::shared_ptr
en std::unique_ptr
, ou vice versa? Cette opération est-elle sûre?
shared_ptr
.
La bibliothèque standard C ++ 11 fournit-elle un utilitaire pour convertir de a std::shared_ptr
en std::unique_ptr
, ou vice versa? Cette opération est-elle sûre?
shared_ptr
.
Réponses:
std::unique_ptr
est le moyen C ++ 11 d'exprimer la propriété exclusive, mais l'une de ses fonctionnalités les plus attrayantes est qu'il se convertit facilement et efficacement en un fichierstd::shared_ptr
.C'est un élément clé de la raison
std::unique_ptr
pour laquelle il convient si bien qu'un type de retour de fonction d'usine. Les fonctions d'usine ne peuvent pas savoir si les appelants voudront utiliser la sémantique de propriété exclusive pour l'objet qu'ils retournent ou si la propriété partagée (c'est-à-direstd::shared_ptr
) serait plus appropriée. En renvoyant unstd::unique_ptr
, les usines fournissent aux appelants le pointeur intelligent le plus efficace, mais ils n'empêchent pas les appelants de le remplacer par son frère plus flexible.
std::shared_ptr
àstd::unique_ptr
n'est pas autorisé. Une fois que vous avez transformé la gestion à vie d'une ressource en astd::shared_ptr
, vous ne pouvez plus changer d'avis. Même si le nombre de références est égal à un, vous ne pouvez pas récupérer la propriété de la ressource pour, par exemple, lastd::unique_ptr
gérer.Référence: C ++ moderne efficace. 42 MANIÈRES SPÉCIFIQUES D'AMÉLIORER VOTRE UTILISATION DE C ++ 11 ET C ++ 14. Scott Meyers.
En bref, vous pouvez facilement et efficacement convertir un std::unique_ptr
en std::shared_ptr
mais vous ne pouvez pas le convertir std::shared_ptr
en std::unique_ptr
.
Par exemple:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
ou:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
std::unique_ptr
à a std::shared_ptr
.
Étant donné unique_ptr u_ptr, créez shared_ptr s_ptr:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
Il n'est pas pratique d'aller dans l'autre sens.
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deleter
stocké à l'intérieur duunique_ptr