我有類似下面的類定義:默認拷貝賦值
class UUID
{
public:
// Using implicit copy assignment operator
private:
unsigned char buffer[16];
};
我剛剛有了一個單元測試失敗,對我這是驗證拷貝賦值工作正常。令我驚訝的是,buffer []數組中間的一個字節被錯誤地複製了。
我理解的是默認複製賦值運算符執行成員拷貝,並且對於陣列成員(未指針到陣列成員),其引起該陣列的按元素副本。我錯了嗎?
我的直覺在這裏的感覺是,我被懸空指針的地方,對我的數組的中間跺着腳咬傷。但是,當我看到這個重複時,例如我將這些對象的矢量複製到另一個矢量中。
有人關心地告訴我,我已經走了錯了嗎?
編輯:
爲了擴展這個有點,該類不是一個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);
}
你是怎麼找到「在[]數組被複制錯誤的緩衝區中的一個字節。」顯示測試用例?是否有任何特定的條目(100個)被損壞? – Chubsdad 2010-09-10 02:08:48
@Chubsdad:UUID類有一個重載流的插入器,它會轉儲成員數組的內容。對於這個測試用例,矢量的所有100個元素都將其緩衝區[9]字節損壞,以完全相同的值。 – 2010-09-10 02:47:49
好的。是否有可能顯示重載的運算符==? – Chubsdad 2010-09-10 03:19:41