2012-02-28 2 views
12

Мой вопрос прост, но я не смог найти вопрос в любом месте.Вызывается ли деструктор автоматически?

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

class A { 
    vector<int> data; 
} 

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

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

+2

Вам не хватает полуколонны после объявления класса «А» (что на самом деле не является декларацией, так как оно отсутствует ... о хорошо). –

ответ

14

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

Не существует различий в поведении независимо от того, является ли Aclass или struct.

+14

+1 Для того чтобы быть понятным, «вектор будет обрабатывать очистку выделенной динамической памяти * от * it», а не * до * it. Если вы храните динамически выделенные объекты в векторе, вы несете ответственность за их удаление. – netcoder

+0

@netcoder найдет ваш комментарий немного обманчивым. Вы можете хранить в векторных указателях ** динамически выделенные объекты **, но я не думаю, что вы можете хранить сами «объекты», которые динамически выделяются в векторе. Если вы объявите вектор , где ClassA - это имя класса, тогда вектор позаботится об уничтожении объектов ClassA, которые он удерживает.Конечно, если ваши объекты ClassA содержат указатели на другие объекты, то это означает, что ** ClassA несет ответственность за их удаление **, ** НЕ несет ответственность вектор **, но это уже другая история. –

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 
} 
+0

+1 для соблюдения принципов RAII. Необходимость ручного написания деструкторов должна становиться все меньше и меньше, когда люди кодируют C++, как Struustrup, Sutter, Meyers и другие современные мыслители C++ намереваются написать нам. – stinky472

1

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

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

Смежные вопросы