#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
, если он не содержит тип, который указывает на память; но не освобождает его по своей сути (например, указатель!).