Tengo una definición de clase similar al siguiente:defecto con miembros de la matriz
class UUID
{
public:
// Using implicit copy assignment operator
private:
unsigned char buffer[16];
};
acabo de tener una prueba de unidad falle en mí que verificaba que la asignación copia funcionaba correctamente. Para mi sorpresa, un byte en el medio de la matriz de buffer [] se copió incorrectamente.
Según tengo entendido, el operador de asignación de copia predeterminado realiza una copia en forma de miembro, y la de los miembros de la matriz (no los elementos de puntero a matriz) que implica la copia con elementos de la matriz. ¿Estoy equivocado?
Mi presentimiento es que me ha picado un puntero colgando en alguna parte que ha pisoteado el centro de mi matriz. Pero, estoy viendo esto repetidamente cuando, p. Copio un vector de estos objetos en otro vector.
¿Alguien me dice dónde me he equivocado?
Editar:
Para ampliar esto un poco, la clase no es un tipo POD - se deriva de unas pocas clases de base abstracta y por lo tanto tiene un destructor virtual. Sin embargo, la matriz es el único miembro de datos, y el uso que se rompió en la prueba de la unidad era la siguiente:
const int n = 100;
std::vector<UUID> src, dst;
src.reserve(n);
dst.resize(n);
for (int i = 0; i < n; ++i) {
UUID id;
src.push_back(id);
}
for (int i = 0; i < n; ++i) {
dst[i] = src[i];
}
bool good = true;
for (int i = 0; i < n; ++i) {
const bool thisGood = (dst[i] == src[i]);
std::cout << "i = " << i << " -> src = '" << src[i]
<< "', dst = '" << dst[i] << "', src == dst ? "
<< thisGood << '\n';
good = (good && thisGood);
}
Cómo encontró que "un byte en el medio de la matriz de buffer [] se copió incorrectamente". con el caso de prueba que se muestra? ¿Hay alguna entrada en particular (de 100) que se está corrompiendo? – Chubsdad
@Chubsdad: la clase UUID tiene un insertador de flujo sobrecargado que vuelca el contenido de la matriz miembro. Para este caso de prueba, todos los 100 elementos del vector tienen su búfer de buffer [9] corrupto, exactamente al mismo valor. –
Ok. ¿Es posible mostrar el operador sobrecargado ==? – Chubsdad