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
ounique_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 destd::sort
tenía exactamente esta lógica en 1996, que es exactamente lo que provocó el segundo rediseño deauto_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.