У меня есть массив указателей (которые я создал, вызвав new ptr*[size]
). Все эти указатели указывают на объект, который также был помещен в кучу.
Как правильно удалить массив и все новые ptr?
Это то, что я делаю сейчас:
for (int i = 0; i < size; i++) delete array[i];
delete[] array; // Not sure since this double deletes array[0]
Это делает то, что я думаю, что должно?
Спасибо
Каждый указатель выделен с 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>
).
Да, это делает то, что вы думаете, что должно. Так как вы сделали new
для каждого элемента вы должны delete
каждый элемент. И так как вы сделали new[]
для всего массива вам нужно delete[]
весь массив.
Как справедливо говорит @djechlin в комментариях, на самом деле информации недостаточно, но я предполагаю, что ваш предыдущий код выглядит примерно так:
int** array = new int*[5];
for (int i = 0; i < 5; i++) {
array[i] = new int;
}
Обратите внимание, что массив на самом деле не является типом массива. Это «указатель на указатель на int» и массив указателей, на которые он указывает new[]
, Вот почему вам нужно delete[]
Это.
Да. Сначала вы должны освободить объект, на который указывает каждый указатель в массиве, затем вы должны освободить сам массив. В этой последовательности. Если вы измените порядок, у вас не будет ссылок на объекты, и вы потеряете много памяти.
Да, сначала вы удаляете каждый объект, на который указывают элементы массива, а затем вы сами удаляете массив указателей. Если вы хотите проверить управление памятью, вы можете использовать такие инструменты, как Valgrind, они смогут обнаружить большинство ошибок.