c++ - smart - shared_ptr example
¿C++ 11 unique_ptr y shared_ptr pueden convertirse al tipo del otro? (2)
std::unique_ptr
es la forma en C ++ 11 de expresar propiedad exclusiva, pero una de sus características más atractivas es que se convierte fácil y eficientemente enstd::shared_ptr
.Esta es una parte clave de por qué
std::unique_ptr
es tan adecuado como un tipo de retorno de función de fábrica. Las funciones de fábrica no pueden saber si las personas que llaman querrán usar una semántica de propiedad exclusiva para el objeto que devuelven o si la propiedad compartida (es decir,std::shared_ptr
) sería más apropiada. Al devolver unstd::unique_ptr
, las fábricas brindan a las personas que llaman el puntero inteligente más eficiente, pero no impiden que las personas que llaman lo reemplacen con su hermano más flexible.
std::shared_ptr
astd::unique_ptr
no está permitido. Una vez que haya cambiado la gestión de por vida de un recurso astd::shared_ptr
, no cambiará de opinión. Incluso si el recuento de referencias es uno, no puede reclamar la propiedad del recurso para, por ejemplo, hacer questd::unique_ptr
administre.Referencia: efectiva C ++ moderna. 42 MANERAS ESPECÍFICAS PARA MEJORAR SU USO DE C ++ 11 Y C ++ 14. Scott Meyers.
En resumen, puede convertir de manera fácil y eficiente
std::unique_ptr
a
std::shared_ptr
pero no puede convertir
std::shared_ptr
a
std::unique_ptr
.
Por ejemplo:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
o:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
¿La biblioteca estándar de C ++ 11 proporciona alguna utilidad para convertir de
std::shared_ptr
a
std::unique_ptr
, o viceversa?
¿Es esta operación segura?
Dado unique_ptr u_ptr, crea shared_ptr s_ptr:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
Ir por el otro lado no es práctico.