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 [] удаляет только элементы в array.It не удаляет память, на которую указывают элементы массива. Если вы хотите удалить память, на которую указывают элементы массива
- Удалите каждую память явным образом, вызвав delete для каждого элемента массива
- затем удалить массива удалить [оператор]
Comments