Структура глубокой копии
Это может быть очень простой вопрос, но каким-то образом он меня обманул... когда я пишу тестовый код, он работает, но что-то не так в производстве.
// 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 или компилятором С++?
Ответы
Ответ 1
Глубоким копиям мешают только указатели, поэтому ваш struct
будет скопирован правильно в C. Он также будет работать на С++, если вы не определите свой собственный operator=
, который не копирует правильно. Вам нужно всего лишь определить operator=
для типов с указателями, поскольку мелкая копия указателя скопирует указатель, но поделится данными.
Ответ 2
Мой ответ относится к С++. Я могу только догадываться, что он все еще подходит для C.
Это будет мелкая копия.
Если объекты содержат указатели t1
и t2
, каждый из которых содержит местоположение некоторого непрямого, динамически выделенного блока памяти, вам понадобится глубокая копия.
Однако объекты содержат прямые объекты фактического времени массива, поэтому вы отлично разбираетесь в мелкой копии.
(Немного ошибочно, что это работает, но вы не можете вручную назначать объекты массива самостоятельно!)