Почему “удаляют [] [] … multiDimensionalArray”; оператор в C++ не существует

Из «Искусства компьютерного программирования», стр.3: «Стрелка« ← »на шаге E3 является важнейшей операцией замены , иногда называемой назначением или [113 ] замена «. Обычный способ n←m произносится так: «n установлен на m», хотя это имеет императивный вкус программирования.

22
задан 7 revs, 4 users 99% 13 October 2008 в 16:25
поделиться

8 ответов

Технически, в C ++ нет двухмерных массивов. В качестве двумерного массива вы используете одномерный массив, каждый элемент которого является одномерным массивом. Поскольку он технически не существует, C ++ не может его удалить.

25
ответ дан 29 November 2019 в 03:43
поделиться

Поскольку нет никакого способа звонить

int **array = new int[dim1][dim2];

, Все новости/удалять должны быть сбалансированы, таким образом, нет никакого смысла к delete [][] оператор.

new int[dim1][dim2] возвраты указатель на массив размера dim1 из типа int[dim2]. Так dim2 должно быть постоянное время компиляции. Это подобно выделению многомерных массивов на стеке.

20
ответ дан 29 November 2019 в 03:43
поделиться

Причина удаляет, назван многократно в том примере, то, потому что новый назван многократно также. Удалите должен быть назван для каждого нового.

, Например, если я выделяю 1 000 000 байтов памяти, я не могу позже удалить записи от 200,000 - 300,00, она была выделена как один целый блок и должна быть освобождена как один целый блок.

7
ответ дан 29 November 2019 в 03:43
поделиться

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

при выделении двухмерной антенной решетки Вы действительно создали одномерные массивы N. Теперь каждый из тех должен быть удален, но система не знает, сколько из них существует. Размер массива верхнего уровня, т.е. массив указателей на Ваши массивы второго уровня, точно так же, как любой другой массив в C: его размер не хранится системой.

Поэтому нет никакого способа реализовать delete [][], как Вы описываете (не изменив язык значительно).

6
ответ дан 29 November 2019 в 03:43
поделиться

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

int ** mArr = new int*[10];
for(int i=0;i<10;i++)
{
   mArr[i]=new int[10];
}

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

4
ответ дан 29 November 2019 в 03:43
поделиться

удалите [], относится к любому нескаляру (массив).

0
ответ дан 29 November 2019 в 03:43
поделиться

Можно использовать класс обертки, чтобы сделать все те вещи для Вас. Работа с "примитивными" типами данных обычно не является хорошим решением (массивы должны инкапсулироваться в классе). Например, станд.:: вектор является очень хорошим примером, который делает это.

Удаляют, должен быть назван точно, сколько раз новый назван. Поскольку Вы не можете звонить "= новый X [b]", Вы не можете также звонить, "удаляют [] [] a".

Технически это - хорошее проектное решение, предотвращающее появление странной инициализации всей n-мерной матрицы.

0
ответ дан 29 November 2019 в 03:43
поделиться

Ну, я думаю, что легко реализовать, но слишком опасный. Легко сказать, создается ли указатель new[], но трудно сказать [приблизительно 111] (если позволено).

0
ответ дан 29 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: