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);
}
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
@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. –
Ok. Ist es möglich, den überladenen Operator == anzuzeigen? – Chubsdad