Релиз памяти boost :: shared_ptr из std :: vector

0

Я пытаюсь освободить память 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 не выйдет из области действия, поскольку является членом класса объекта, который остается в исполнении в спящем потоке.

  • 0
    vec.release() должен уничтожить все. Но что бы вы ни делали, память, вероятно, будет освобождена до кучи процесса, а не обратно в ОС (хотя детали зависят от платформы). Вам понадобится более глубокая магия, если вы действительно хотите этот уровень контроля.
  • 5
    Не используйте инструменты ОС для определения того, что делает менеджер кучи C++ внутри.
Показать ещё 15 комментариев
Теги:
c++11
vector
boost
stl

1 ответ

1

Если у вас есть 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> не очищает память после выхода из области видимости

  • 0
    Сброс обеспечивает освобождение памяти каждого вектора?
  • 2
    Если вы вызываете ptr.reset() когда ptr.use_count() == 1 и ptr.get() != NULL , то деструктор будет вызываться для содержащегося в std::vector<T> .
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню