Правильный способ удаления массива указателей

У меня есть массив указателей (которые я создал, вызвав new ptr*[size]). Все эти указатели указывают на объект, который также был помещен в кучу.

Как правильно удалить массив и все новые ptr?

Это то, что я делаю сейчас:

for (int i = 0; i < size; i++) delete array[i];
delete[] array; // Not sure since this double deletes array[0]

Это делает то, что я думаю, что должно?

Спасибо

3

Решение

Каждый указатель выделен с new получает соответствующий delete, Каждый указатель выделен с new [] получает соответствующий delete [], Это действительно все, что вам нужно знать. Конечно, когда у вас есть динамически размещенный массив, который содержит динамически размещенные указатели, освобождение должно происходить в обратном порядке.

Отсюда следует, что правильная идиома будет …

int main()
{
int **container = new int*[n];
for(int i = 0; i < n; ++i)
container[i] = new int[size];

// ... and to deallocate...
for(int i = 0; i < n; ++i)
delete [] container[i];

delete [] container;
}

И тогда, конечно, я говорю «прекратить делать это» и рекомендую вам использовать std::array или же std::vector (и тип шаблона будет unique_ptr<int>).

9

Другие решения

Да, это делает то, что вы думаете, что должно. Так как вы сделали new для каждого элемента вы должны delete каждый элемент. И так как вы сделали new[] для всего массива вам нужно delete[] весь массив.

Как справедливо говорит @djechlin в комментариях, на самом деле информации недостаточно, но я предполагаю, что ваш предыдущий код выглядит примерно так:

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

Обратите внимание, что массив на самом деле не является типом массива. Это «указатель на указатель на int» и массив указателей, на которые он указывает new[], Вот почему вам нужно delete[] Это.

2

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

1

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

0
По вопросам рекламы [email protected]