smart shared_ptr make_unique c++ c++11 unique-ptr

c++ - make_unique - shared_ptr



std:: unique_ptr use (3)

std::unique_ptr<int> p1(new int); std::unique_ptr<int> p2(new int); p2=p1;

Aquí parece que p1 ya no es "único", ya que p2 también lo hace

¿Es legal c ++? ¿Tiene unique_ptr copy_semantics? Si no, y si solo ha movido la semántica, ¿se establece p1 en NULL después de asignarlo a p2?

EDITAR:

ok entonces la versión correcta es

p2=std::move(p1)

De acuerdo con eso, después de esta asignación, ¿p1 no es válido? ¿Y la diferencia con auto_ptr está aquí? es más seguro explícitamente la transferencia específica de propiedad que implícitamente como es el caso con auto_ptr, supongo


Aquí hay un artículo que escribí que responde a sus preguntas. Originalmente escribí este artículo para presentar una emulación de unique_ptr. Sin embargo, puede ignorar los primeros párrafos relacionados con la emulación y comenzar a leer los "Ejemplos básicos".

http://howardhinnant.github.io/unique_ptr03.html

Editar:

Tuve problemas para destilar el artículo vinculado anteriormente a algo tan pequeño como para dar una respuesta práctica en este formato. Sin embargo aquí está mi mejor tiro:

El motivo: Seguridad en código genérico. Realmente no se pueden hacer copias de auto_ptr o unique_ptr . Considerar:

template <class T> void foo(T t) { T copy_of_t = t; // line 4 assert(copy_of_t == t); }

No es raro que el código genérico se vea como foo arriba. La afirmación probablemente no está realmente allí, pero la suposición de que la afirmación se mantendría a menudo está ahí ... implícitamente . De hecho, una implementación popular de std::sort tenía exactamente esta lógica en 1996, que es exactamente lo que provocó el segundo rediseño de auto_ptr (que ayudó, pero no solucionó el problema por completo).


Según this , p2=p1 es un error de compilación.


std :: unique_ptr no es asignable ni puede copiarse. Necesitas usar std :: move ();

asi que

p1 = std::move(p2);

Echa un vistazo here para más información.