2010-09-09 64 views
6

我有類似下面的類定義:默認拷貝賦值

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); 
} 
+0

你是怎麼找到「在[]數組被複制錯誤的緩衝區中的一個字節。」顯示測試用例?是否有任何特定的條目(100個)被損壞? – Chubsdad 2010-09-10 02:08:48

+0

@Chubsdad:UUID類有一個重載流的插入器,它會轉儲成員數組的內容。對於這個測試用例,矢量的所有100個元素都將其緩衝區[9]字節損壞,以完全相同的值。 – 2010-09-10 02:47:49

+0

好的。是否有可能顯示重載的運算符==? – Chubsdad 2010-09-10 03:19:41

回答

9

我理解的是默認複製賦值運算符執行成員複製,並且對於陣列成員(而不是指向數組的成員),這需要數組的元素拷貝。

是。這是對的。

你的問題是不是與拷貝賦值運算符(除非你已經發現了一些不尋常的編譯器缺陷,這是不可能的)。

+0

感謝您確認我的懷疑。一些調試魔法的時間,我認爲... – 2010-09-09 23:26:28

+0

@德魯:祝你好運! :-) – 2010-09-09 23:28:05

+0

謝謝!我想我會需要它。順便說一句,我在編輯中添加了一些額外的文本/測試用例代碼。我不認爲它會改變任何事情,但我認爲無論如何都會引起你的注意。 – 2010-09-09 23:39:38