c++ - 数组成员的默认复制赋值

标签 c++ arrays assignment-operator copy-assignment

我有一个类似于下面的类定义:

class UUID
{
  public:
    // Using implicit copy assignment operator

  private:
    unsigned char buffer[16];
};

我刚刚有一个单元测试失败了,它验证了复制分配是否正常工作。令我惊讶的是,buffer[] 数组中间的一个字节被错误地复制了。

我的理解是,默认的复制赋值运算符执行成员复制,并且对于数组成员(不是指向数组的指针成员),需要对数组进行元素复制。我错了吗?

我的直觉是我被某个悬空的指针咬伤了,它踩在了我的数组中间。但是,例如,我会反复看到这一点。我将这些对象的 vector 复制到另一个 vector 中。

有人愿意告诉我我哪里做错了吗?

编辑:

进一步说明,该类不是 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);
}

最佳答案

My understanding is that the default copy assignment operator performs memberwise copy, and that for array members (not pointer-to-array members) that entailed elementwise copy of the array.

是的。这是正确的。

您的问题不在于复制赋值运算符(除非您发现了一些不寻常的编译器错误,这不太可能)。

关于c++ - 数组成员的默认复制赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3681265/

相关文章:

c++ - 链接到静态 .lib 的问题链接到静态 .lib

c++ - 乘以存储在一维数组算法中的上三角矩阵

arrays - SystemVerilog 中的索引操作对整数类型有何作用?

java - 在不转换为列表的情况下在 MongoDB 中存储 float 数组

c++ - 为什么标准允许由左值引用元组分配右值引用元组?

c++ - OpenSceneGraph LNK2019

c++ - QSystemTrayIcon 不显示

c++ - 循环失败

Lua操作符,为什么没有定义+=、-=等?

c++ - 在 C++ 中,从 int 到 object 的赋值怎么可能?