Domanda

Ho una definizione di classe simile al seguente:

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

  private:
    unsigned char buffer[16];
};

Ho appena avuto una prova di unità fallire su di me che è stato verificato che l'assegnazione copia funzionato correttamente. Con mia grande sorpresa, un byte nel mezzo della matrice del buffer [] è stato copiato in modo non corretto.

Mi risulta che le copia predefinite esegue operatore assegnazione memberwise copia, e che per i membri di matrice (non membri puntatore a matrice) che comporta copia elementwise dell'array. Mi sbaglio?

La mia sensazione viscerale è che sono stato morso da un penzoloni da qualche puntatore che ha calpestato la metà del mio array. Ma, sto vedendo questo ripetibile quando, ad esempio, Copio un vettore di questi oggetti in un altro vettore.

Qualcuno vuole dirmi dove ho sbagliato andato?

Modifica

Per espandere su questo un po ', la classe non è un tipo di POD - deriva da un paio di classi base astratte e ha un distruttore virtuale così. Tuttavia, l'array è l'unico membro dei dati, e l'uso che ha rotto nel test unità era questo:

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);
}
È stato utile?

Soluzione

  

Mi risulta che le esegue operatore assegnazione copia predefinita memberwise copia, e che per membri di matrice (membri non puntatore a matrice) che connesse con elementwise copia della matrice.

Sì. Questo è corretto.

Il problema non è con l'operatore di assegnamento per copia (a meno che non si è trovato un po 'insolito bug del compilatore, il che è improbabile).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top