Подтвердить что ты не робот

Вызывается ли вызванный деструктор автоматически

Мой вопрос прост, но я нигде не мог найти вопрос.

Если у меня есть такой класс

class A {
    vector<int> data;
}

Когда экземпляр A будет уничтожен, будет data также корректно уничтожен, или я должен написать деструктор для A, который вызывает data destructor? В основном я беспокоился о том, что динамическая память вектора не будет освобождена при уничтожении экземпляра A. Я подозреваю, что ответ заключается в том, что data освобождается должным образом, но я не хочу выяснять, что я не прав.

Кроме того, если A была структурой, деструктор для data вызывается, когда локальный экземпляр A выпадает из области видимости?

4b9b3361

Ответ 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 деструктор.

Во всех случаях, как с вашим собственным деструктором, так и с деструктором, созданным по умолчанию, все деструкторы для нестатических членов данных, а также любые базовые классы текущего класса вызываются в конце деструктор и до того, как сама функция деструктора вернется.