我有类似下面的类定义:默认拷贝赋值
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