c ++ удаление памяти члена векторного класса в деструкторе

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

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

НАПРИМЕР:

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?
    }
 }
 David12 июн. 2012 г., 06:09
В новом мире, C ++ 11-land, вы больше не называетеdelete сам. Вы используете unique_ptrs (обычно) или shared_ptrs (редко), чтобы вызвать его для вас.
 Martin York12 июн. 2012 г., 06:05
вектор в порядке. Ноstuff не является безопасным из-за конструктора копирования и оператора присваивания (потому что компилятор сгенерирует их автоматически). Смотрите правило трех (или пять в C ++ 11).
 chris12 июн. 2012 г., 05:36
Видя, как он помечен C ++, вы, вероятно, хотитеnew/delete надmalloc/free.

Ответы на вопрос(4)

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

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

 12 июн. 2012 г., 05:32
Возможно, ему не придетсяdestroy fred экземпляр, если он имеет автоматическую продолжительность хранения, т.е. выделенный стек.
 12 июн. 2012 г., 05:34
Когда я сказал «ты уничтожаешь», я имел в виду «когда он уничтожен».
 12 июн. 2012 г., 05:29
v не обязательно в стеке! Зависит ли этот экземплярfred был выделен в стеке или нет
 12 июн. 2012 г., 05:30
О верно! Не рассматривал этот случай :( Спасибо за внимание.

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

Нестатические элементы & apos; Dtors вызываются, когда вы достигаете закрытия} деструктора в обратном порядке, в котором они были объявлены. Затем вызывается деструктор базового класса, если он есть.

 12 июн. 2012 г., 05:50
@dirkgently Исправление: dtors членов называются вreverse порядок, в котором они былиdeclared в классеdeclaration
 bandjalong12 июн. 2012 г., 05:37
Это замечательно, но я подумал, что если бы я писал свой собственный деструктор для класса (не полагаясь на стандартный по умолчанию), то такой автоматической очистки не происходило бы. Вы говорите, что деструктор векторов будет вызван, хотя у меня есть явный деструктор ??
 12 июн. 2012 г., 05:56
@Dave: Да, я пытался втиснуть столько, сколько мог, и в процессе немного перепутал: /
 12 июн. 2012 г., 05:40
Да. Для всех нестатических объектов, не являющихся указателями, dtor вызывается автоматически, как только вы достигнете «& apos;}» тела dtor в том порядке, в котором эти члены были определены в определении класса (а затем вызываются dtors базового класса, которые, в свою очередь, удаляют базовые члены, если они есть, и так далее ...).

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

Ваш ответ на вопрос