Вопрос по memory-management, c++, vector – c ++ удаление памяти члена векторного класса в деструкторе

3

У меня есть класс, содержащий переменную-член вектора. Я знаю, что векторы, хранящиеся в стеке, будут очищены (то есть свободны от памяти, 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?
    }
 }
Видя, как он помечен C ++, вы, вероятно, хотитеnew/delete надmalloc/free. chris
В новом мире, C ++ 11-land, вы больше не называетеdelete сам. Вы используете unique_ptrs (обычно) или shared_ptrs (редко), чтобы вызвать его для вас. David
вектор в порядке. Ноstuff не является безопасным из-за конструктора копирования и оператора присваивания (потому что компилятор сгенерирует их автоматически). Смотрите правило трех (или пять в C ++ 11). Martin York

Ваш Ответ

4   ответа
0

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

0

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

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

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

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

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

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

Похожие вопросы