Деструктор вызывается автоматически

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

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

class A {
    vector<int> data;
}

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

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


person Dunes    schedule 28.02.2012    source источник
comment
Вам не хватает точки с запятой после объявления class A (что на самом деле не является объявлением, поскольку его не хватает... да ладно).   -  person Matthieu M.    schedule 28.02.2012


Ответы (3)


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

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

person Naveen    schedule 28.02.2012
comment
+1 Просто для ясности, вектор будет обрабатывать очистку динамической памяти, выделенной им им, а не для него. Если вы храните динамически размещаемые объекты в векторе, вы несете ответственность за их соответствующее delete . - person netcoder; 28.02.2012
comment
@netcoder считает ваш комментарий немного вводящим в заблуждение. Вы можете хранить в векторе указатели на динамически размещаемые объекты, но я не думаю, что вы можете хранить сами объекты, которые динамически размещаются в векторе. Если вы объявите вектор ClassA›, где ClassA — это имя класса, то вектор позаботится об уничтожении объектов ClassA, которые он содержит. Конечно, если ваши объекты ClassA содержат указатели на другие объекты, то их удаление является ответственностью ClassA, а НЕ ответственностью вектора, но это уже другая история. - person Gab是好人; 29.11.2016

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

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

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 
}
person 111111    schedule 28.02.2012
comment
+1 за соблюдение хороших принципов RAII. Необходимость вручную писать деструкторы должна становиться все меньше и меньше, когда люди пишут код на C++ так, как Страуструп, Саттер, Мейерс и другие современные мыслители C++ хотят, чтобы мы писали его. - person stinky472; 28.02.2012

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

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

person Jason    schedule 28.02.2012