クラスコピー時の配列やポインタについて

メンバ変数に配列が含まれている場合、クラスの代入処理をした場合、配列の先頭アドレスの値だけがコピーされ複数のオブジェクトで共有されることになり、片方のオブジェクトが破棄される際のデストラクタ処理などでアドレスが参照する先の領域が解放されてしまう恐れがある。

俗にいう、シャローコピー。

これを回避するためには、独自のコピー演算子を定義して、

// char dst[10];
// char src[10];
std::memmove(&dst, &src, sizeof(src));

なりで、配列の全要素の値をコピーする必要がある。

配列だけでなく、メンバ変数にポインタが含まれる場合も同様。

追記

この記事、間違ってるかも。

char型配列を含むクラスを格納したvectorのコピー


で確認したところ、少なくともchar型配列のメンバ変数においては

Hoge a;
Hoge b;
b = a;

とすれば、char型配列の全要素がコピーされ、コピー先で要素を書き換えても、コピー元には影響しない。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です