Как освободить std :: vector, если нет кучи памяти - PullRequest
5 голосов
/ 28 октября 2011

У меня есть переменная-член класса, подобная этой:

vector<vector<int> >  m_stacks;

Когда я его заполняю, я делаю так:

vector<int> v;
v.push_back(1);
v.push_back(2);
m_stacks.push_back(v);
vector<int> v2;
v2.push_back(1);
v2.push_back(2);
m_stacks.push_back(v2);

Теперь мне интересно, что я должен сделать в деструкторе класса, чтобы выпустить m_stacks. Я не выделяю для этого кучи памяти, поэтому я изо всех сил стараюсь что-то предпринять. Наконец-то я это придумаю -

vector<vector<int> >::iterator itr = m_stacks.begin();
for ( ; itr != m_stacks.end(); ++itr) {
  itr->clear();
}

Я думаю, это самое большее, что мне нужно сделать, мне не нужно звонить m_stacks.clear(). Причина в том, что деструктор вектора может автоматически освободить память. Но мне все еще нужен приведенный выше код, причина в том, что деструктор вектора не вызывает деструктор его элемента.

Не могли бы вы подтвердить мой звонок?

Ответы [ 3 ]

14 голосов
/ 28 октября 2011

Вам не нужно ничего делать для m_stacks (элемент данных class).Приобретенная память будет освобождена автоматически при вызове деструктора class.Для этой цели используется std::vector.

8 голосов
/ 28 октября 2011

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

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

6 голосов
/ 28 октября 2011

Деструктор std::vector вызывает удаление из памяти, которую он выделяет, тем самым вызывая деструктор этого типа (в данном случае, std::vector<int>).

Все эти структуры данных основаны на принципах SBRM (управление ресурсами, связанными с областью) или RAII (получение ресурсов - инициализация), в которых вся выделяемая ими память освобождается после того, как выходит из области видимости (такой как учебный класс).

Вам не нужно беспокоиться об освобождении памяти из std::vector, если только он не содержит тип, который указывает на память; но не освобождает его по своей сути (например, указатель!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...