C ++ удаляет массив в куче - PullRequest
0 голосов
/ 21 октября 2018

У меня возникают трудности с поиском ответа о том, как правильно выполнить эту операцию.

Я бы хотел лучше понять различные способы удаления новой памяти, выделенной в куче, особенно в случаедвумерный массив.

Для моего примера: у меня в стеке массив размером 5, состоящий из указателей int (int * d [5]).Я инициализирую каждый из этих указателей int в цикле, чтобы создать и указать на массив int размером 8 в куче (d [i] = new int [8]).Теперь я по существу создал двумерный массив (d [j] [k]).

Мой вопрос: каков синтаксис для удаления только отдельных массивов (int [8]) в куче?

В настоящее время у меня это так, но при отладке кажется, что массивы не освобождаются после выполнения ...

для (int i = 0; i <5; ++ i)delete d [i]; </p>

Должно ли это быть "delete [] d [i]" или просто "delete [] d" или какой-то другой вариант?Кроме того, есть ли способ удалить отдельные элементы массивов int [8]?Если бы кто-то мог кратко объяснить синтаксис и их различия, это было бы очень полезно.Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

вы упомянули, что вы размещаете внутренние массивы внутри цикла.я думаю, что это выглядит примерно так:

int*d[2];
for (int i = 0; i < 2; i++)
{
    d[i] = new int[3];
}

Обратите внимание, что d[2] содержит только указатели на массивы.поэтому, чтобы удалить этот массив, вы должны выполнить итерацию по каждому набору указателей массива и вызвать delete [] d [i];

for (int i = 0; i < 2; i++)
{
        delete[] d[i];
}

В качестве дополнительной заметки, это было бы очень полезнознать, как ваша IDE пытается обнаружить повреждения памяти.

например, в Visual Studio (в режиме DEBUG)

  • 0xCD означает выделенную память через malloc или новую, но никогда не записываемая приложением.
  • 0xCC означает неинициализированные переменные.
  • 0XDD означает, что память была освобождена с удалением или освобождением.
  • 0xFD означает память забора и действует как охранник.используется для обнаружения индексных массивов, выходящих за границы.

, помня об этом, давайте посмотрим, сможем ли мы понять, что делает IDE при выполнении приведенного выше кода.

Когда массив d объявлен int*d[2];, схема памяти выглядит следующим образом;enter image description here обратите внимание, что массив d имеет два элемента, но ни один из них не имеет начальных значений, поэтому они присваиваются 0xCC

, давайте посмотрим, что произойдет после того, как мы сделаем d[i] = new int[3]; enter image description here обратите внимание, что массив d теперь имеет два элемента, каждый элемент содержит массив int.значения, которые вы видите, являются адресами указателей на массив, для которого мы выделили память.

, так как мы знаем, что это за адреса, мы можем посмотреть в память и увидеть, что там происходит при выделении иудаляя каждый массив.

например, после того, как мы разместим наш второй массив int в цикле for, ячейка памяти будет выглядеть примерно так;
enter image description here обратите внимание, что все элементы массива имеют 0xCD с окончанием 0xFD. Это будет указывать в моей IDE, что память выделена и вокруг нее установлены ограждения.

позволяет увидеть, что происходит при удалении d[2].enter image description here

0 голосов
/ 21 октября 2018

Если вы выделили массивы с помощью d[i] = new int[8], вы должны удалить их с помощью delete[] d[i].Невозможно освободить отдельные элементы такого массива без полного освобождения всего этого.

...