У меня есть определение класса, подобное следующему:
class UUID
{
public:
// Using implicit copy assignment operator
private:
unsigned char buffer[16];
};
У меня только что произошел сбой модульного теста, который проверял правильность работы присваивания копий. К моему удивлению, один байт в середине массива buffer [] был скопирован неправильно.
Насколько я понимаю, оператор присваивания копии по умолчанию выполняет поэлементное копирование и это для элементов массива (не элементов указателя на массив), которые влечет за собой поэлементное копирование массива. Я ошибаюсь?
Мне кажется, что меня где-то укусил болтающийся указатель, который наступил на середину моего массива. Но я вижу это постоянно, когда, например, я копирую вектор этих объектов в другой вектор.
Кто-нибудь хочет сказать мне, где я ошибся?
Изменить:
Чтобы расширить это, a немного, класс не является типом POD - он является производным от нескольких абстрактных базовых классов и, следовательно, имеет виртуальный деструктор. Однако массив является единственным элементом данных, и использование, которое не удалось в модульном тесте, было следующим:
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);
}