Как определяется / создается ваш массив? Если вы создаете его с помощью new
и ссылаетесь на него указателем, вам понадобится специальный конструктор копирования, создающий глубокую копию (т.е. создающий новый экземпляр массива и копирующий его содержимое). Конструктор копирования по умолчанию будет выполнять только поверхностное копирование, поэтому оба экземпляра будут использовать одну и ту же память (т. Е. Оба указателя указывают на один и тот же массив в куче).
Это будет работать с конструктором копирования по умолчанию:
class myclass {
char text[256];
}
Это не будет работать с конструктором копирования по умолчанию (по крайней мере, не так, как ожидалось):
class myclass {
char *text;
myclass() : text(new char[256]) {}
~myclass() { delete [] text; }
}
Элемент, определенный как static
, никогда не будет скопирован. Все экземпляры делятся им без дополнительного кода:
class myclass {
static char text[256];
}
Конструктор копирования для второго случая может выглядеть следующим образом (обратите внимание, это упрощено и не проверяет допустимые значения и тому подобное):
myclass(const myclass &base) : text(new char[256]) { strcpy(text, base.text); }
Общее правило:
Использую ли я какой-либо элемент указателя, которому присваивается возвращаемое значение некоторого new
? Если это так, напишите конструктор копирования. Если нет, то он использует его по умолчанию (если у вас нет других причин).