int* temp = new int[n];
Это выделяет новый массив int
в динамической области, назначая выделенный массив temp
. Сразу после этого:
temp = currArr;
Принимает вновь выделенный массив temp
и немедленно перезаписывает этот указатель существующим указателем currArr
. Недавно выделенная память просочилась, и когда все и сказано и сделано, и temp
, и currArr
теперь являются одним и тем же значением указателя (второе назначение, двумя строками позже, не меняет этого, уже слишком поздно) .
delete[] currArr;
delete[] temp;
Следовательно, это приводит к тому, что delete[]
дважды получает одно и то же значение указателя, что приводит к неопределенному поведению, повреждению памяти и вероятному сбою.
Кроме того, даже если распределение в цикле является фиксированным, чтобы оно не перекрывалось, поскольку цикл может выполняться более одного раза, и это delete
ничего только в конце цикла, нет никакого способа в любом случае избегайте утечки памяти.
Я определяю адрес памяти для temp, меняя то, что хранится в
этот адрес во время каждой итерации, а затем аккуратно удаляя содержимое
этого адреса в конце?
Нет, вы теряете память, портите память, вызываете неопределенное поведение и, скорее всего, происходит сбой.
Вам необходимо исправить первоначальное распределение, чтобы оно не перекрывалось, и delete
предыдущий буфер (currArray
) сразу после выделения нового (temp
), а затем, наконец, назначить temp
до currArray
(после копирования его содержимого).