2010-09-09 14 views
6

ich eine Klassendefinition ähnlich der folgenden haben:Standard Kopie Zuordnung mit Array-Mitglieder

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

    private: 
    unsigned char buffer[16]; 
}; 

Ich habe gerade ein Unit-Test auf mich nicht, dass war die Überprüfung, dass Kopie Zuordnung richtig gearbeitet. Zu meiner Überraschung wurde ein Byte in der Mitte des puffer [] -Arrays falsch kopiert.

Mein Verständnis ist, dass der Standardkopiezuweisungsoperator memberwise-Kopie ausführt, und das für Array-Mitglieder (nicht Pointer-zu-Array-Mitglieder), die elementweise Kopie des Arrays enthält. Täusche ich mich?

Mein Bauchgefühl ist hier, dass ich irgendwo von einem baumelnden Zeiger gebissen wurde, der in der Mitte meines Arrays gestampft hat. Aber ich sehe das wiederholt, wenn z.B. Ich kopiere einen Vektor dieser Objekte in einen anderen Vektor.

Will mir jemand sagen, wo ich falsch gelaufen bin?

Edit:

auf diesen ein wenig zu erweitern, ist die Klasse nicht ein POD-Typ - es von einigen abstrakten Basisklassen abgeleitet und somit einen virtuellen Destruktor hat. Jedoch ist die Anordnung das einzige Datenelement, und die Verwendung, die in dem Gerät zu testen brach, war dies:

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

Wie haben Sie gefunden "ein Byte in der Mitte des Buffer [] Array wurde falsch kopiert." mit dem Testfall gezeigt? Gibt es einen bestimmten Eintrag (von 100), der beschädigt wird? – Chubsdad

+0

@Chubsdad: Die UUID-Klasse hat einen Stream-Inserter geladen, der den Inhalt des Member-Arrays ablegt. Für diesen Testfall ist bei allen 100 Elementen des Vektors das Puffer-Byte [9] auf genau denselben Wert beschädigt. –

+0

Ok. Ist es möglich, den überladenen Operator == anzuzeigen? – Chubsdad

Antwort

9

Mein Verständnis ist, dass der Standard-Kopierzuweisungsoperator führt eine element Kopie, und das für die Array-Elemente (nicht Zeiger auf Array-Elemente), die eine elementweise Kopie des Arrays beinhalteten.

Ja. Das ist richtig.

Ihr Problem ist nicht mit dem Kopierzuweisungsoperator (es sei denn, Sie haben einen ungewöhnlichen Compilerfehler gefunden, der unwahrscheinlich ist).

+0

Danke für die Bestätigung meines Verdachts . Zeit für einige Debugger Magie, denke ich ... –

+0

@Drew: Viel Glück! :-) –

+0

Danke! Ich denke, ich werde es brauchen. Übrigens, ich habe einen zusätzlichen Text-/Testfallcode in eine Bearbeitung eingefügt. Ich glaube nicht, dass sich dadurch etwas ändert, aber ich dachte, ich würde es sowieso auf dich aufmerksam machen. –