web-dev-qa-db-ja.com

c ++暗黙的なコピーコンストラクタは配列メンバー変数をコピーしますか?

可能性のある複製:
C配列メンバーはコピー制御関数でどのように処理されますか?

メンバー変数がポインターとして宣言されている場合、暗黙のコピーコンストラクター(コンパイラーによって生成される)がポインターをコピーすると思います。

配列のメンバー変数がどうなるかわかりません。

暗黙のコピーコンストラクターは配列メンバーを正しくコピーしますか?代入演算子はどうですか?

例えば:

char mCharArray[100];
int mIntArray[100];   

MCharArray mIntArrayは正しくコピーされますか?

29
eugene

はい、そうです。これは、Cの構造体にも当てはまります。

typedef struct {
    int a[100];
} S;

S s1;
s1.a[0] = 42;
S s2;
s2 = s1;    // array copied
57

できるだけ明確にするために:

struct X
{
    char data_[100];
};

X a, b;
a.data_[10] = 'x';
b = a;
// here, b.data_[n] == a.data_[n] for 0 <= n < 100, so b.data_[10] == 'x'

しかし、潜在的に厄介なケースは、ポインタと参照です。

struct X
{
    char* data_[100];
};

X a, b;
a.data_[10] = new char[6]; // a character array on the heap
strcpy(a.data_[10], "hello"); // put some text into it...
b = a;
// here, b.data_[n] == a.data_[n] for 0 <= n < 100
//   so b.data_[10] == a.data_[10] == same character array containing "hello"
// BUT...
b.data_[10][2] = 'L';  // change text to "heLlo" via b.data_[10] pointer...
// here, a.data_[10][2] will be 'L' too, as a.data_[10] and b.data_[10] both point
// to the same underlying heap memory returned by new above...
delete[] a.data_[10];  // ok...
std::cout << b.data_[10];  // NOT ok - this memory's been deallocated!
delete[] b.data_[10];  // NOT ok - this memory's (already) been deallocated!

うまくいけば、それは問題を説明するのに役立ちます。

構造をより「コピーセーフ」にする1つの方法を検討してください。

struct X
{
    X(const X& rhs)
    {
        for (int i = 0; i < 100; ++i)
            if (rhs.data_[i])
            {
               // deep copy of pointed-to text...
               data_[i] = new char[strlen(rhs.data_[i]) + 1];
               strcpy(data_[i], rhs.data_[i]);
            }
            else
               data_[i] = NULL;
    }
    char* data_[100];
};

ここでは、コピーコンストラクターがX b = aすべての文字列データの独自のコピーを作成し、コピーされたXオブジェクトへの依存や接続がなくなるため、より安全で直感的になりますが、これは遅くなり、メモリを無駄にする可能性があります。

8
Tony Delroy

「暗黙的なコピーコンストラクター(コンパイラーによって生成)」-すべての変数に対して浅いコピーを実行します。

1
Sujay Ghosh