Структура глубокого копирования - PullRequest
11 голосов
/ 24 мая 2011

Это может быть очень простой вопрос, но почему-то меня обманули ... когда я пишу тестовый код, кажется, что он работает, но что-то идет не так в работе.

// Header file
#define length 100
typedef struct testStr_t {
    int a;
    char b;
    char t1[length];
    char t2[length];
} test;

void populateTest(test*);

// source file
test test1;
test test2;
populateTest(&test1);
test2 = test1;

Будет ли test2 глубокой копией test1? Или здесь есть ошибки? Имеет ли значение, если код скомпилирован с помощью компилятора C или C ++?

Ответы [ 2 ]

10 голосов
/ 24 мая 2011

Глубокие копии ограничиваются только указателями, поэтому ваш struct будет правильно скопирован в C. Он будет работать и в C ++, если вы не определите свой собственный operator=, который не копирует правильно. Вам нужно только определить operator= для типов с указателями, поскольку поверхностная копия указателя будет копировать указатель, но совместно использовать данные.

3 голосов
/ 24 мая 2011

Мой ответ относится к C ++.Я могу только догадываться, что это все еще подходит для C.

Это будет мелкая копия.

Если объекты содержат указатели t1 и t2, каждый из которых содержит местоположение некоторого косвенного, динамически распределяемого блока памяти, вам понадобится глубокая копия.

Однако, объекты содержат прямые объекты реального времени массива, так что вы в порядке смелкая копия.

(Это немного вводит в заблуждение, что это работает, но вы не можете вручную назначать объекты массива самостоятельно!)

...