Как указано в комментариях к вашему сообщению, ваше решение верное.
Чтобы более подробно объяснить, почему вы правы, вы позаботились о том, чтобы выделить больше памяти, прежде чем скопировать и удалить свои текущие данные.,Это единственный порядок вещей: резерв (новый массив), копирование, резервирование (старый массив).(Во всяком случае, так я это помню.)
Более подробно: temp
- это указатель, а не сам массив.Это очень важный и часто неправильно понимаемый момент.Я много с этим боролся, лично.Итак, когда вы просто говорите T* temp;
, вы выделяете место для указателя в вашем текущем кадре.Когда вы говорите T* temp = new T[size];
, вы выделяете место для указателя в текущем кадре И запрашиваете больше места (равное sizeof(T) * size
байт) в другом месте памяти.
Это означает, что temp
, какУказатель - это локальная переменная, но на которую он указывает, это не так.Когда вы присваиваете arrayPointer = temp;
, вы говорите, что ваши элементы данных указывают, где temp
указывает, но это не равно temp
в том смысле, что это локальная переменная.Вот почему вы хотите delete[] arrayPointer
перед тем, как назначить его равным temp
, иначе вы никогда не сможете восстановить память, на которую указывал arrayPointer
.Наконец, когда вы говорите arrayPointer = temp;
, ничего в памяти, на которую указывает temp
, не копируется;только значение (указатель) temp
копируется в arrayPointer
(поэтому вам нужно явно скопировать элементы исходного массива в новый массив, но не наоборот).Затем, когда ваш процесс выходит из этого фрейма, все локально объявленные переменные освобождаются, поэтому temp
удаляется как указатель, но то, на что он указывал, не освобождается, потому что оно не было в фрейме (даже если оно было выделено вкадр).
Пара профессиональных советов: вместо цикла for я рекомендую взглянуть на std::copy
, а temp = nullptr;
на самом деле излишне, поскольку память, выделенная для temp
(как локальная переменная) будет освобождена, как только функция вернется (как обсуждалось выше).
Надеюсь, это немного поможет концептуально.Но, опять же: вы определенно правы:)