Вызывается ли вызванный деструктор автоматически
Мой вопрос прост, но я нигде не мог найти вопрос.
Если у меня есть такой класс
class A {
vector<int> data;
}
Когда экземпляр A
будет уничтожен, будет data
также корректно уничтожен, или я должен написать деструктор для A
, который вызывает data
destructor? В основном я беспокоился о том, что динамическая память вектора не будет освобождена при уничтожении экземпляра A
. Я подозреваю, что ответ заключается в том, что data
освобождается должным образом, но я не хочу выяснять, что я не прав.
Кроме того, если A
была структурой, деструктор для data
вызывается, когда локальный экземпляр A
выпадает из области видимости?
Ответы
Ответ 1
Да, data
будет автоматически уничтожен, вам не нужно ничего делать для его достижения. vector
будет обрабатывать очистку выделенной им динамической памяти. Вектор-деструктор будет вызываться автоматически при уничтожении экземпляра A
.
Нет никакой разницы в поведении, независимо от того, является ли A
class
или struct
.
Ответ 2
Не нужно, деструкторы элементов данных всегда вызываются.
Явный деструктор полезен для управления ручной памятью
struct a{
int* ip;
a()
: ip(new int(5))
{ }
~a() { delete ip; }
};
Тем не менее, вы должны использовать RAII-контейнеры (например, интеллектуальные указатели), поэтому я лично редко пишу dtors в те дни.
И исключение - объявить базовые классы dtor как виртуальные.
struct base {
virtual ~base() {}
};
struct child : public base {
//base and child destructor automatically called
}
Ответ 3
Деструктор-по умолчанию создается автоматически компилятором, если вы не определяете его самостоятельно. В общем, вам не нужно создавать свой собственный деструктор, если у вас нет указателей данных-членов, которые "владеют" памятью, на которую они указывают, и/или вы разрабатываете свой класс, который должен быть получен другими классами, и в этот момент вы захотите по крайней мере, объявить пустой virtual
деструктор.
Во всех случаях, как с вашим собственным деструктором, так и с деструктором, созданным по умолчанию, все деструкторы для нестатических членов данных, а также любые базовые классы текущего класса вызываются в конце деструктор и до того, как сама функция деструктора вернется.