Вызывается ли деструктор автоматически
мой вопрос прост, но я не смог найти вопрос нигде.
если у меня есть такой класс
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
деструктор.
во всех случаях, как с вашим собственным деструктором, так и с созданным компилятором по умолчанию деструктор, все деструкторы для нестатических членов данных, а также любые базовые классы текущего класса вызываются в конце деструктора и до возвращения самой функции деструктора.