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

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

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

class A {
    vector<int> data;
}

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

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

3 ответов


да data будет уничтожен автоматически, вам не нужно ничего делать для его достижения. vector будет обрабатывать очистку динамической памяти, выделенной им. Деструктор вектора будет вызываться автоматически, когда экземпляр A разрушается.

нет никакой разницы в поведении, независимо от того,A это class или struct.


нет необходимости, деструкторы элемента данных всегда вызываются.

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

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 
}

деструктор по умолчанию создается компилятором автоматически, если вы не определяете его самостоятельно. В общем случае вам не нужно создавать свой собственный деструктор, если у вас нет указателей data-members, которые "владеют" памятью, на которую они указывают, и/или вы разрабатываете свой класс для получения от других классов, в этот момент Вы хотели бы, по крайней мере, объявить пустое virtual деструктор.

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