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



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



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

676   6  

6 ответов:

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

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

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

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

Итак, если эти необработанные указатели являются владельцами указателей , у вас есть leaktrocity :)

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

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

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

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

Нет, delete[] только освобождает массив, созданный new[]

Дополнительную информацию смотрите в справочнике.

Команда delete [] удаляет только элементы в array.It не удаляет память, на которую указывают элементы массива. Если вы хотите удалить память, на которую указывают элементы массива

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

Comments

    Ничего не найдено.