Удаление массива указателей

Есть ли delete[] a, где a - массив указателей с динамическим распределением, выполните delete для каждого указателя в массиве?

Я предполагаю, что он выполняет деструктор для массивов с пользовательскими классами, но что происходит с указателями?

Ответы

Ответ 1

Нет, delete [] используется для удаления массива. Если вам нужно удалить элементы массива, вам нужно вызвать delete для каждого из них.

Ответ 2

Нет. Необработанные указатели не содержат информации о том, как (или) ли их цель должна быть освобождена, поэтому уничтожение одного никогда не удалит цель.

Вот почему вы никогда не должны использовать их для управления динамическими ресурсами - вы должны сами выполнять всю работу, которая может быть очень подвержена ошибкам. Вместо этого вы должны использовать RAII, заменяя указатели контейнерами, интеллектуальными указателями и другими классами, которые управляют ресурсами и автоматически освобождают их при уничтожении. Замените динамический массив std::vector (или std::vector<std::unique_ptr>, если вам действительно нужно выделить каждый объект отдельно), и все будет автоматически освобождено.

Ответ 3

Нет, если a представляет собой динамически выделенный массив raw указателей, delete[] a; просто удаляет память, занятую массивом необработанных указателей, но не вызывает деструкторы для объектов указал на.

Итак, если эти исходные указатели владеют указателями, у вас есть непротиворечивость:)

Используйте класс STL container с интеллектуальными указателями, например. std::vector<std::unique_ptr<X>>, для более современного и более простого подхода: таким образом вы получаете как исключение-безопасность, так и автоматическое уничтожение как массива указателей, так и объектов, на которые указывает.

Ответ 4

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

Именно поэтому используются интеллектуальные указатели: delete[] вызовет деструктор каждого элемента, а деструктор умного указателя вызовет delete на управляемом указателе.

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

Ответ 6

Удалить [] удалит только элементы в массиве. Он не удалит память, указанную элементами массива. Если вы хотите удалить память, указанную элементами массива

  • Удалить каждую ячейку явным образом, вызвав delete для каждого элемента массива
  • Затем удалите массив с помощью оператора delete []