Хотя все эти ответы актуальны, я постараюсь объяснить, что привело к ожиданию, что что-то вроде delete[][] array;
может работать с динамически размещаемыми массивами и почему это невозможно:
Синтаксис int array[ROWS][COLS];
, разрешенный для статически выделенных массивов, является просто абстракцией для программистов, которые в действительности создают одномерный массив int array[ROWS*COLS];
. Но в процессе компиляции (когда размеры размерности COLS
и ROWS
должны быть постоянными по стандарту), компилятор также запоминает размер этих измерений, которые необходимы для последующего обращения к элементам с использованием синтаксиса, например, array[x][y] = 45
. Компилятор, известный как этот размер, затем заменит [x][y]
соответствующим индексом для одномерного массива с помощью простой математики: [COLS*x + y]
.
С другой стороны, это не относится к динамически выделенным массивам, если вам нужна та же многомерная функциональность (на самом деле нотация). Поскольку их размер может быть определен во время выполнения, они должны будут помнить размер каждого дополнительного измерения для последующего использования - и помнить об этом на протяжении всего срока службы массива. Более того, системные изменения должны были бы быть реализованы здесь, чтобы работать с массивами, фактически как многомерными, оставляя форму нотации доступа [x][y]
в коде, не заменяя ее одномерной нотацией во время компиляции, но позже заменяя ее внутри во время выполнения.
Следовательно, отсутствие из array = new int[ROWS][COLS]
не предполагает необходимости для delete[][] array;
. И, как уже упоминалось, это не может быть использовано в вашем примере для удаления вашего «многомерного» массива, потому что ваши подмассивы (дополнительные измерения) размещаются отдельно (с помощью отдельного вызова new
), поэтому они не зависят от верхний массив (array_2D
), который содержит их, и все они не могут быть удалены сразу.