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

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

  private:
    unsigned char buffer[16];
};

我刚刚对我的单位测试失败了,该测试正在验证该副本作业正常工作。令我惊讶的是,在缓冲区中间[]阵列中间的一个字节被错误地复制了。

我的理解是,默认的副本分配运算符执行成员副本,并且对于带有数组元素副本的数组成员(而不是指针到阵列成员)。我误会了吗?

我在这里的直觉是,我被一个悬空的指针咬伤了,在我的阵列中间踩了。但是,当我将这些对象的向量复制到另一个向量时,我会重复看到这一点。

有人愿意告诉我我出了什么问题吗?

编辑:

为了对此进行扩展,该类不是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);
}
有帮助吗?

解决方案

我的理解是,默认的副本分配运算符执行成员副本,并且对于带有数组元素副本的数组成员(而不是指针到阵列成员)。

是的。这是对的。

您的问题不是与复制分配操作员一起使用(除非您发现了一些不寻常的编译器错误,这不太可能)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top