Подтвердить что ты не робот

С++ делает неявный экземпляр переменной массива экземпляра копии экземпляра?

Возможный дубликат:
Как члены массива C обрабатываются в функциях управления копированием?

Я бы предположил, что неявный конструктор копирования (сгенерированный компилятором) скопировал бы указатель, если переменная-член объявлена ​​как указатель.

Я не уверен, что происходит с переменной члена массива.

Правильно ли используется экземпляр массива-блока неявного экземпляра? Как насчет оператора присваивания?

Например:

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

Будет ли скопирован mCharArray mIntArray правильно?

4b9b3361

Ответ 1

Да и да - ответ. Это также относится к структурам в C.

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

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

Ответ 2

Просто сделайте это как можно яснее:

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 been deallocated!
delete[] b.data_[10];  // NOT ok - this memory (already) been deallocated!

Мы надеемся, что это поможет справиться с проблемой.

Рассмотрим один способ сделать структуру более "безопасной для копирования":

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 или, но это медленнее и потенциально более расточительная память.

Ответ 3

"неявный экземпляр копирования (сгенерированный компилятором)" - делает мелкую копию для всех переменных.

Ответ 4

Да. Операторы копирования и операторов присваивания встроены в C/С++. Они выполняют байтовую копию (что не подходит для больших массивов, поскольку это вызовет раздувание кода). Он также копирует указатель, но это будет мелкая копия (если указатель указывает на какое-то место, скопированный указатель также укажет на то же местоположение).