2012-06-12 2 views
2

У меня есть класс, содержащий переменную-член вектора. Я знаю, что векторы, хранящиеся в стеке, будут очищены (т.е. свободны от памяти), когда они выходят из области , но я не уверен, что уничтожение объекта класса - который содержит переменную-член вектора - считается выходящим из сферы действия.C++ удаление элемента класса элемента в деструкторе

Если это не так, то подходящий способ уничтожить вектор?

EG:

class fred { 
    char *stuff; 
    vector<int> v; 

    fred() : stuff(), v() {} 
    ~fred() { 
     if (stuff) free(stuff); 
     // now how do I clear up the vector v? Will it be done automatically? 
    } 
} 
+2

Увидев, как он помечен C++, вы, вероятно, хотите 'new/delete' над' malloc/free'. – chris

+2

вектор в порядке. Но 'stuff' не безопасен из-за конструктора копирования и оператора присваивания (потому что компилятор автоматически сгенерирует их). См. Правило три (или пять в C++ 11). –

+1

В новом мире, C++ 11-land, вы больше не называете 'delete' себя. Вы используете unique_ptrs (обычно) или shared_ptrs (редко), чтобы позвонить ему для вас. – David

ответ

0

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

+2

'v' не обязательно в стеке! Это зависит от того, был ли этот экземпляр 'fred' выделен в стеке или нет – David

+0

О, верно! Не рассматривал этот случай :( Спасибо за головы. – mtahmed

+0

Возможно, ему не нужно * уничтожить * экземпляр 'fred', если он имеет автоматическую продолжительность хранения, т.е. экземпляр, выделенный стекю. – Praetorian

5

Векторный вид для вашего текста! Когда класс разрушается, все его члены также называются деструкторами. В этом случае вызывается деструктор v, который очищает все, что он выделяет.

Детекторы нестатических элементов вызываются, когда вы достигаете замыкания } деструктора в обратном порядке, в котором они были объявлены. Тогда вызывается деструктор вашего базового класса, если он присутствует.

+0

Это здорово, но я подумал, что если бы я писал свой собственный деструктор для класса (не полагаясь на его по умолчанию), то автоматическая очистка не произойдет. Вы говорите, что деструктор векторов будет вызываться, даже если у меня есть явный деструктор? – bandjalong

+1

Да. Для всех нестатических, не указательных объектов-членов dtor вызывается автоматически, как только вы достигаете '}' тела dtor в том порядке, в котором эти члены были определены в определении класса (а затем вызывается базовый класс dtors, который, в свою очередь, удаляет базовые элементы, если они есть и т. д.). – dirkgently

+0

@ dirkgently Исправление: dtors of члены вызываются в _reverse_ порядке, в котором они были _declared_ в классе _declaration_ – David

0

Я думаю, вам не нужно звонить DTOR для вектора. DTOR будет вызываться, как только объект выходит за пределы области действия, что означает, что DTOR fred вызывается.

0

Всегда существует ТОЛЬКО ОДИН способ уничтожить объект, а это его деструктор (в отличие от него вы можете создавать объекты несколькими способами). Контейнеры STL были разработаны специально, чтобы избежать такого микроуправления памятью в структурах данных. Если вам нужно явно выделять или освобождать память в контейнере STL, вы делаете это неправильно.

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