Я пытаюсь освободить память 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 не выйдет за пределы области видимости, поскольку является членом класса объекта, который продолжает выполняться в спящем потоке.
vec.release()
должен уничтожить все. Но что бы вы ни делали, память, вероятно, будет высвобождена в кучу процесса, а не обратно в ОС (хотя детали зависят от платформы). Вам понадобится более глубокая магия, если вы действительно хотите такого уровня контроля. - person Mike Seymour   schedule 21.07.2014C++
менеджер кучи. - person PaulMcKenzie   schedule 21.07.2014vec
? Это не может бытьshared_ptr<...>
, потому что тогда ваш код не скомпилируется. И вы можете рассмотреть Boost.MultiArray вместо вектора вектора векторов. - person Praetorian   schedule 21.07.2014var.clear(); type(var).swap(var);
? - person Johan   schedule 21.07.2014I've released vectors without pointers before and it worked
Вам не гарантируется, что это работает. На самом деле это диспетчер кучи компилятора, который управляет взаимодействием между использованием памяти кучи вашим приложением и ОС. Может быть, простая причина заключается в том, что менеджер кучи понимает, что вы можете снова выделить память, поэтому все, что ему нужно сделать, это настроить пару внутренних указателей в своих структурах данных вместо того, чтобы делать дорогостоящий вызов ОС для освобождения (и затем выделения снова). ). - person PaulMcKenzie   schedule 21.07.2014vec
являетсяshared_ptr
?std::vector<std::vector<std::vector<int> > >(vec)
— обратите внимание, что в приведенном выше примере у вас есть дополнительные>
. - person Praetorian   schedule 21.07.2014clear/build/swap
, я вижу, что он работает. Я сказал что-то глупое об итераторе, потому что они действительно будут сохранены в замененном векторе, который будет уничтожен. Но мне кажется, что это чересчур. - person Johan   schedule 21.07.2014vec->capacity()
до и послеswap
- person Praetorian   schedule 21.07.2014vec->capacity() == 0
послеswap
:) - person Praetorian   schedule 21.07.2014