Dre*_*all 9 c++ arrays assignment-operator copy-assignment
我有一个类似于以下的类定义:
class UUID
{
public:
// Using implicit copy assignment operator
private:
unsigned char buffer[16];
};
Run Code Online (Sandbox Code Playgroud)
我刚刚对我进行了单元测试失败,验证了副本分配是否正常工作.令我惊讶的是,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);
}
Run Code Online (Sandbox Code Playgroud)
Jam*_*lis 12
我的理解是,默认的复制赋值操作符执行成员复制,而数组成员(不是指向数组的成员)则需要执行元素的元素复制.
是.这是对的.
您的问题不在于复制赋值运算符(除非您发现了一些不常见的编译器错误,这是不太可能的).