Как @aschepler упоминает в комментариях, это зависит от того, как изначально была выделена память. Я предполагаю, что вы, вероятно, выделяется память, как это:
int*** t = new int**[dim1];
for (int i = 0; i < dim1; i++) {
t[i] = new int*[dim2];
for (int j = 0; j < dim2; j++) {
t[i][j] = new int[dim3];
}
}
Если вы выделили память таким образом, то память будет выглядеть примерно так:
[ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
+---> [ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
| [ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
|
t ---> [ 0 ] [ 1 ]
|
| [ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
+---> [ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
Теперь предположим, что вы просто написать
delete[] t;
Если вы сделаете это, то память будет выглядеть следующим образом:
[ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
t ---> xxx
[ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
Другими словами, вы восстановили один из массивов, но вы просочились в большую часть памяти. К сожалению!
С другой стороны, если вы используете версию кода удаления для цикла, вы в конечном итоге восстанавливаете всю память, потому что вы прошли все указатели и освободили каждый выделенный массив.
Вообще говоря, каждое распределение должно иметь соответствующее освобождение, поэтому, если вы вызываете new[]
несколько раз, вам нужно позвонить delete[]
равное количество раз.
Как уже отмечалось в некоторых комментариях, есть, вероятно, более эффективные способы управления 3D-массивом, чем использование int ***
. Общая тенденция на C++ заключается в использовании объектов для автоматического управления памятью как можно больше. Рассмотрите возможность поиска типа Boost multi_array
или подумайте о создании обертки вокруг std::vector
, в которой хранятся записи в строчном порядке.
Ответ зависит от того, как память была выделена в первую очередь. – aschepler
Off topic: 'int ***' не будет трехмерным массивом. Это будет массив массивов массивов. Они могут иметь действительно плохую производительность кеша. Если ты просто что-то ударишь, ОК. Если вам нужна скорость, рассмотрите массив 1D и оболочку, что делает его похожим на трехмерный массив. – user4581301
И почему бы не использовать 'std :: vector' в первую очередь? – Jarod42