2013-02-23 3 views
5

В простой 1D массив:Как удалить этот 2D массив в C++

node *nodes = new node[MAX_NODES]; 

вытирания:

delete [] nodes; 

Удаляет все узлы, выделенные в массиве.

Но в этом случае:

float (*buildingArray)[3] = new float[10][3]; 

делают ли это утверждение buildingArray один размер массива из 3 поплавковых указателей? И это открепление линия:

delete[] buildingArray; 

ли выше открепление delete массив, но я сомневаюсь, будут ли удалить свои ссылки?

+0

Используйте векторы вместо этого - http://www.cplusplus.com/reference/vector/vector - намного проще. –

+5

Иногда существующая база кода заставляет нас использовать двумерные массивы. Если бы я мог скомпенсировать комментарии ... – codetaku

ответ

15

Приведенное выше выделение выделяет массив?

Да, так оно и есть.

Просто следуйте правилу:

Вам нужно позвонить delete или delete [] столько раз, сколько вы называемых new или new [] соответственно.


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


На стороне записки вы гораздо лучше использовать std::vector или std::array, а не динамически выделенный массив.

+0

хорошо, поэтому здесь каждый элемент не имеет динамической памяти, только 1 размер (строки) имеют динамическую память, а 3 столбца имеют статическую память, поэтому нет необходимости их деаламинировать. Я прав ? – Anubha

+0

@Anubha: оператор 'float (* buildingArray) [3] = new float [10] [3];' выделяет достаточную динамическую память для хранения массива из 10 массивов из 3-х поплавков. Все хранилище находится на freestore (aka heap). Но поскольку он был выделен с помощью одного вызова 'new []' одного вызова 'delete []' отлично декодирует его. –

+0

ОК, поэтому в этом вопросе http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new, при инициализации массива использовалось 2 новых оператора, therefore simple delete [] ary; не работал бы в этом случае? – Anubha

2

new float[10][3] выделяет массив из 10 массивов из 3 floats и возвращает указатель на первый элемент (который представляет собой массив из 3 поплавков).

Вызов delete[] на этом указателе вызывает удаление всего массива.

Единственное различие между двумя случаями состоит в том, что в первом случае тип значений, хранящихся в динамически распределяемом массиве, равен float, а во втором случае - float[3].

3

Да, так оно и есть. Объяснение объясняется тем, что в памяти нет информации о том, сколько измерений имеет ваш массив.

Если у вас есть массив элементов 3 * 4, это точно так же, как массив из 12 элементов. Это именно то, как вы обращаетесь к конкретным элементам (которые хранятся в строке после линии), которые меняются.

So delete[] будет работать отлично.

Но использование new и delete операторов не так распространено в наши дни с smart pointers, если у вас действительно нет веских оснований для управления распределением самостоятельно.

Смежные вопросы