【问题标题】:Default copy assignment with array members数组成员的默认复制分配
【发布时间】:2011-04-10 12:34:19
【问题描述】:

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

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);
}

【问题讨论】:

  • 您是如何发现“buffer[] 数组中间的一个字节被错误复制的”。显示测试用例?是否有任何特定条目(共 100 个)被损坏?
  • @Chubsdad:UUID 类有一个重载的流插入器,它转储成员数组的内容。对于这个测试用例,向量的所有 100 个元素的缓冲区 [9] 字节都已损坏,值完全相同。
  • 好的。是否可以显示重载的运算符==?
  • @Chubsdad:这只是您期望的元素比较——它工作正常,并确认了我在输出文本和调试器中的直接检查中看到的内容。此外,到目前为止,该代码在 Linux 上的 MinGW(4.5.4)和 GCC 上运行良好——它似乎只在 MSVC 2005 上被破坏。我想我一定有内存损坏......

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


【解决方案1】:

我的理解是,默认的复制赋值运算符执行成员复制,而对于数组成员(不是指向数组成员的指针)则需要数组的元素复制。

是的。这是正确的。

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

【讨论】:

  • 谢谢!我想我会需要它。顺便说一句,我在编辑中添加了一些额外的文本/测试用例代码。我不认为它会改变任何东西,但我想我还是会引起你的注意。
  • 我遇到了类似的问题,这实际上导致了 g++ 编译器的一些已知错误。 stackoverflow.com/questions/16128882/…
猜你喜欢
  • 1970-01-01
  • 2011-10-02
  • 2022-11-13
  • 2011-09-03
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多