2010-09-09 19 views
6

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); 
} 
+0

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

+0

@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. –

+0

Ok. ¿Es posible mostrar el operador sobrecargado ==? – Chubsdad

Respuesta

9

Mi entendimiento es que el operador de asignación de copia predeterminado realiza miembro por miembro copiar, y que por miembros de la matriz (no puntero a los miembros de la matriz) que implicó la copia elemento de la matriz.

Sí. Esto es correcto.

Su problema no está con el operador de asignación de copias (a menos que haya encontrado algún error de compilación inusual, que es poco probable).

+0

Gracias por confirmar mis sospechas . Es hora de un poco de depuración mágica, creo ... –

+0

@Drew: ¡Buena suerte! :-) –

+0

¡Gracias! Creo que lo voy a necesitar Por cierto, agregué un texto extra/código de caso de prueba en una edición. No creo que cambie nada, pero pensé que me gustaría llamar su atención de todos modos. –

Cuestiones relacionadas