Из «Искусства компьютерного программирования», стр.3: «Стрелка« ← »на шаге E3 является важнейшей операцией замены , иногда называемой назначением или [113 ] замена «. Обычный способ n←m
произносится так: «n установлен на m», хотя это имеет императивный вкус программирования.
Технически, в C ++ нет двухмерных массивов. В качестве двумерного массива вы используете одномерный массив, каждый элемент которого является одномерным массивом. Поскольку он технически не существует, C ++ не может его удалить.
Поскольку нет никакого способа звонить
int **array = new int[dim1][dim2];
, Все новости/удалять должны быть сбалансированы, таким образом, нет никакого смысла к delete [][]
оператор.
new int[dim1][dim2]
возвраты указатель на массив размера dim1
из типа int[dim2]
. Так dim2
должно быть постоянное время компиляции. Это подобно выделению многомерных массивов на стеке.
Причина удаляет, назван многократно в том примере, то, потому что новый назван многократно также. Удалите должен быть назван для каждого нового.
, Например, если я выделяю 1 000 000 байтов памяти, я не могу позже удалить записи от 200,000 - 300,00, она была выделена как один целый блок и должна быть освобождена как один целый блок.
Причина, как которая необходимо циклично выполниться, в примере, который Вы упоминаете, состоит в том, что количество массивов, которое должно быть удалено, не известно компилятору / средство выделения.
при выделении двухмерной антенной решетки Вы действительно создали одномерные массивы N. Теперь каждый из тех должен быть удален, но система не знает, сколько из них существует. Размер массива верхнего уровня, т.е. массив указателей на Ваши массивы второго уровня, точно так же, как любой другой массив в C: его размер не хранится системой.
Поэтому нет никакого способа реализовать delete [][]
, как Вы описываете (не изменив язык значительно).
не уверен в точной причине с точки зрения языкового дизайна, я предполагаю, что это как-то связано с тем фактом, что при выделении памяти вы создаете массив массивов, и каждый из них должен быть удален.
int ** mArr = new int*[10];
for(int i=0;i<10;i++)
{
mArr[i]=new int[10];
}
мой c ++ ржавый, я не уверен, что это синтаксически правильно, но я думаю, что это близко.
Можно использовать класс обертки, чтобы сделать все те вещи для Вас. Работа с "примитивными" типами данных обычно не является хорошим решением (массивы должны инкапсулироваться в классе). Например, станд.:: вектор является очень хорошим примером, который делает это.
Удаляют, должен быть назван точно, сколько раз новый назван. Поскольку Вы не можете звонить "= новый X [b]", Вы не можете также звонить, "удаляют [] [] a".
Технически это - хорошее проектное решение, предотвращающее появление странной инициализации всей n-мерной матрицы.
Ну, я думаю, что легко реализовать, но слишком опасный. Легко сказать, создается ли указатель new[]
, но трудно сказать [приблизительно 111] (если позволено).