Скопированный указатель по-прежнему указывает на исходный номер, который больше не существует, поскольку массив был перераспределен из-за изменения размера.
Я предполагаю, что CArray использует присваивание, а не копирование. Определите оператор присваивания, чтобы увидеть, исправляет ли это:
CWeird& operator=(CWeird w) { swap(w); return *this; }
void swap(CWeird& w) { int t = number; number = w.number; w.number = t; }
Как правило, это хорошая идея, чтобы избежать противоречивого поведения между копированием и назначением.
Кстати, в приведенном выше коде используется идиоматический подход к реализации семантики присваивания с надежными гарантиями исключительной безопасности:
- Возврат неконстантной ссылки во многом является стандартом для
operator=
, поскольку он соответствует семантике примитивных типов.
- Передача параметра по значению является самым простым способом сделать копию оригинала и гарантирует, что этот объект не будет затронут в случае сбоя конструктора копирования.
- Вызов swap переключает переданную копию с этим объектом таким образом, чтобы никогда не выдавать исключение, таким образом выполняя назначение полностью безопасным способом исключения.
В этом случае было бы проще просто присвоить номер, но я обычно выполняю все свои назначения таким образом, чтобы не быть застигнутым брюками, если будущий сопровождающий сделает возможным копирование, чтобы вызвать исключение.