2010-09-09 66 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

相关问题