10

次のようなクラス定義があります。

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

  private:
    unsigned char buffer[16];
};

コピーの割り当てが正しく機能することを確認する単体テストが失敗しました。驚いたことに、buffer[]配列の途中の1バイトが正しくコピーされませんでした。

私の理解では、デフォルトのコピー代入演算子はメンバーごとのコピーを実行し、配列メンバー(配列メンバーへのポインターではない)の場合は、配列の要素ごとのコピーを必要とします。私は間違っていますか?

ここでの私の直感は、アレイの真ん中に踏みつけられたどこかでぶら下がっているポインターに噛まれたということです。しかし、たとえば、これらのオブジェクトのベクトルを別のベクトルにコピーすると、これが繰り返し発生します。

誰かが私がどこで間違っているのか教えてくれませんか?

編集:

これを少し拡張するために、クラスは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);
}
4

1 に答える 1

13

私の理解では、デフォルトのコピー代入演算子はメンバーごとのコピーを実行し、配列メンバー(配列メンバーへのポインターではない)の場合は、配列の要素ごとのコピーを必要とします。

はい。正解です。

あなたの問題はコピー代入演算子にありません(あなたがいくつかの異常なコンパイラのバグを見つけた場合を除いて、それはありそうもないです)。

于 2010-09-09T23:21:19.967 に答える