unique_ptr
no es copiable, solo es movible.
Esto afectará directamente a Test, que es, en su segundo ejemplo, también solo movible y no copiable.
De hecho, es bueno que uses lo unique_ptr
que te protege de un gran error.
Por ejemplo, el problema principal con su primer código es que el puntero nunca se elimina, lo que es realmente malo. Diga, solucionaría esto de la siguiente manera:
class Test
{
int* ptr; // writing this in one line is meh, not sure if even standard C++
Test() : ptr(new int(10)) {}
~Test() {delete ptr;}
};
int main()
{
Test o;
Test t = o;
}
Esto también es malo. ¿Qué pasa si copiaTest
? Habrá dos clases que tengan un puntero que apunte a la misma dirección.
Cuando uno Test
se destruye, también destruirá el puntero. Cuando Test
se destruye su segundo , también intentará eliminar la memoria detrás del puntero. Pero ya se ha eliminado y obtendremos algún error de tiempo de ejecución de acceso a la memoria incorrecto (o un comportamiento indefinido si no tenemos suerte).
Entonces, la forma correcta es implementar el constructor de copia y el operador de asignación de copia, de modo que el comportamiento sea claro y podamos crear una copia.
unique_ptr
está muy por delante de nosotros aquí. Tiene el significado semántico: " Yo soy unique
, así que no puedes simplemente copiarme. Por lo tanto, nos evita el error de implementar ahora los operadores en cuestión.
Puede definir el constructor de copia y el operador de asignación de copia para un comportamiento especial y su código funcionará. Pero estás, con razón (!), Obligado a hacer eso.
La moraleja de la historia: utilizar siempre unique_ptr
en este tipo de situaciones.