Ответ 1
Нет, delete []
используется для удаления массива. Если вам нужно удалить элементы массива, вам нужно вызвать delete
для каждого из них.
Есть ли delete[] a
, где a
- массив указателей с динамическим распределением, выполните delete
для каждого указателя в массиве?
Я предполагаю, что он выполняет деструктор для массивов с пользовательскими классами, но что происходит с указателями?
Нет, delete []
используется для удаления массива. Если вам нужно удалить элементы массива, вам нужно вызвать delete
для каждого из них.
Нет. Необработанные указатели не содержат информации о том, как (или) ли их цель должна быть освобождена, поэтому уничтожение одного никогда не удалит цель.
Вот почему вы никогда не должны использовать их для управления динамическими ресурсами - вы должны сами выполнять всю работу, которая может быть очень подвержена ошибкам. Вместо этого вы должны использовать RAII, заменяя указатели контейнерами, интеллектуальными указателями и другими классами, которые управляют ресурсами и автоматически освобождают их при уничтожении. Замените динамический массив std::vector
(или std::vector<std::unique_ptr>
, если вам действительно нужно выделить каждый объект отдельно), и все будет автоматически освобождено.
Нет, если a
представляет собой динамически выделенный массив raw указателей, delete[] a;
просто удаляет память, занятую массивом необработанных указателей, но не вызывает деструкторы для объектов указал на.
Итак, если эти исходные указатели владеют указателями, у вас есть непротиворечивость:)
Используйте класс STL container с интеллектуальными указателями, например. std::vector<std::unique_ptr<X>>
, для более современного и более простого подхода: таким образом вы получаете как исключение-безопасность, так и автоматическое уничтожение как массива указателей, так и объектов, на которые указывает.
delete[]
будет вызывать деструктор каждого элемента массива. Поскольку указатель является базовым типом, у него фактически нет деструктора, поэтому он ничего не делает.
Именно поэтому используются интеллектуальные указатели: delete[]
вызовет деструктор каждого элемента, а деструктор умного указателя вызовет delete
на управляемом указателе.
Итак: узнайте о умных указателях и прекратите управлять памятью вручную. Это проще, меньше подверженности ошибкам и менее низкого уровня.
Нет, delete[]
освобождает только массив, созданный new[]
Удалить [] удалит только элементы в массиве. Он не удалит память, указанную элементами массива. Если вы хотите удалить память, указанную элементами массива