La bibliothèque standard C ++ 11 fournit-elle un utilitaire pour convertir de a std::shared_ptren 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_ptren std::unique_ptr, ou vice versa? Cette opération est-elle sûre?
shared_ptr.
Réponses:
std::unique_ptrest 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_ptrpour 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_ptrn'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_ptrgé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_ptren std::shared_ptrmais vous ne pouvez pas le convertir std::shared_ptren 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)};
Deleterstocké à l'intérieur duunique_ptr