Я пытаюсь освободить память boost::shared_ptr<std::vector<std::vector<std::vector<int> > > >
используя следующий код:
vec->clear();
std::vector<std::vector<std::vector<int> > > (*vec).swap(*vec);
Но по какой-то причине он не работает. Я проверил с помощью команды htop, и используемая память такая же, как я никогда не выпускал объект.
Затем я попытался выпустить каждый вектор отдельно:
for (auto it1 : *vec)
{
for (auto it2 : it1)
{
it2.clear();
std::vector<int>(it2).swap(it2);
}
it1.clear();
std::vector<int>(it1).swap(it1);
}
Но все равно потребляет тот же объем памяти.
Я делаю что-то неправильно? Возможно, это связано с shared_ptr, потому что раньше я выпустил векторы без указателей, и это сработало.
Обновить
Shared_ptr не выйдет из области действия, поскольку является членом класса объекта, который остается в исполнении в спящем потоке.
Если у вас есть std::shared_ptr<std::vector>>
и вы хотите его удалить:
std::shared_ptr<std::vector<T>> ptr = ...;
ptr.reset();
Если у вас есть std::vector<std::shared_ptr<T>>
и вы хотите его удалить:
std::vector<std::shared_ptr<T>> vec = ...;
vec.clear();
Если у вас есть std::vector<T>
и вы хотите vec.capacity() == vec.size()
:
std::vector<T> vec = ...;
vec.shrink_to_fit(); // or: std::vector<T>(vec).swap(vec);
Если вы обеспокоены тем, что htop
не отображает уменьшенное количество выделенной памяти для процесса, то пусть просто отметьте это как дубликат этого сообщения: vector <string> не очищает память после выхода из области видимости
ptr.reset()
когда ptr.use_count() == 1
и ptr.get() != NULL
, то деструктор будет вызываться для содержащегося в std::vector<T>
.
vec.release()
должен уничтожить все. Но что бы вы ни делали, память, вероятно, будет освобождена до кучи процесса, а не обратно в ОС (хотя детали зависят от платформы). Вам понадобится более глубокая магия, если вы действительно хотите этот уровень контроля.C++
внутри.