Shallow copy (copia superficial) solo copia los valores de los miembros de la clase, incluidos los punteros, pero no copia los datos a los que apuntan esos punteros. Deep copy (copia profunda) crea nuevas copias de los datos a los que apuntan los punteros, lo que evita la propiedad compartida de la memoria y la liberación doble.
Ejemplo:
class Buffer { public: Buffer(size_t size) : size(size), data(new int[size]) {} // Shallow copy (incorrecto) Buffer(const Buffer& other) : size(other.size), data(other.data) {} // Deep copy (correcto) Buffer& operator=(const Buffer& other) { if (this != &other) { delete[] data; size = other.size; data = new int[size]; std::copy(other.data, other.data + size, data); } return *this; } ~Buffer() { delete[] data; } private: size_t size; int* data; };
Si la clase contiene un puntero a un arreglo dinámico, ¿por qué no es suficiente copiar y pegar el constructor de copia y el operador= por defecto?
Respuesta correcta:
La copia por defecto implementa una copia superficial. Dos objetos apuntarán al mismo arreglo, y al destruírse se intentará liberar la misma memoria dos veces (double free), lo que provocará un fallo.
Historia En una gran aplicación de servidor, se implementó una clase Image que gestionaba un búfer dinámico de píxeles. Los desarrolladores no implementaron la copia profunda, y al pasar objetos Image por valor entre hilos se producía una liberación doble de memoria, lo que provocaba fallos críticos cada pocos días.
Historia En un proyecto estudiantil se utilizó un contenedor Field que contenía un puntero a un arreglo dinámico de celdas. Al cambiar el tamaño del arreglo, el constructor de copia solo copiaba el puntero, y ambos contenedores trabajaban con la misma área de memoria, lo que llevaba a datos inconsistentes y errores difíciles de encontrar.
Historia En un viejo código de C++ de un motor gráfico, se implementó una clase Texture sin su destructor y operador de asignación, lo que provocaba memory leak — fugas de memoria al copiar y asignar objetos temporales de texturas.