вы упомянули, что вы размещаете внутренние массивы внутри цикла.я думаю, что это выглядит примерно так:
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];
, схема памяти выглядит следующим образом; обратите внимание, что массив d имеет два элемента, но ни один из них не имеет начальных значений, поэтому они присваиваются 0xCC
, давайте посмотрим, что произойдет после того, как мы сделаем d[i] = new int[3];
обратите внимание, что массив d теперь имеет два элемента, каждый элемент содержит массив int.значения, которые вы видите, являются адресами указателей на массив, для которого мы выделили память.
, так как мы знаем, что это за адреса, мы можем посмотреть в память и увидеть, что там происходит при выделении иудаляя каждый массив.
например, после того, как мы разместим наш второй массив int в цикле for, ячейка памяти будет выглядеть примерно так;
обратите внимание, что все элементы массива имеют 0xCD
с окончанием 0xFD
. Это будет указывать в моей IDE, что память выделена и вокруг нее установлены ограждения.
позволяет увидеть, что происходит при удалении d[2]
.