shared_ptr - smart pointers c++




¿C++ 11 unique_ptr y shared_ptr pueden convertirse al tipo del otro? (2)

¿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?


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 en std::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 un std::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 a std::unique_ptr no está permitido. Una vez que haya cambiado la gestión de por vida de un recurso a std::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 que std::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");

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.





unique-ptr