Pregunta

Tengo una definición de clase similar a la siguiente:

class UUID
{
  public:
    // Using implicit copy assignment operator

  private:
    unsigned char buffer[16];
};

acabo de tener una prueba de unidad falle en mí que fue verificar que la asignación copia funcionaba correctamente. Para mi sorpresa, un byte en el medio de la matriz buffer [] fue copiado de forma incorrecta.

Mi entendimiento es que la copia por omisión realiza operador de asignación miembro por miembro copiar, y que por miembros de la matriz (no miembros puntero a matriz) que ello conlleva copia elementwise de la matriz. ¿Estoy equivocado?

Mi presentimiento es que me ha picado alguna parte una referencia colgante que ha pisado fuerte en el medio de mi matriz. Sin embargo, estoy viendo esta forma repetible cuando, por ejemplo, Copio un vector de estos objetos en otro vector.

A alguien que me diga donde he equivocado ido?

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);
}
¿Fue útil?

Solución

  

Mi entendimiento es que realiza el operador de asignación de copia predeterminada miembro por miembro copiar, y que por miembros de la matriz (miembros no-puntero a matriz) que implicaban elementwise copia de la matriz.

Sí. Esto es correcto.

Su problema no es con el operador de asignación de copia (a no ser que haya encontrado algunos errores del compilador inusual, lo que es poco probable).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top