Как освободить std:: vector, если нет памяти кучи

#c #memory-management #vector

#c #управление памятью #вектор

Вопрос:

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

 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() . Причина в том, что деструктор vector может автоматически освободить память. Но мне все еще нужен приведенный выше код, хотя причина в том, что деструктор vector не вызывает деструктор своего элемента.

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

Ответ №1:

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

Ответ №2:

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

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

Ответ №3:

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

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

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