как освободить память unordered_set?

#c #free #unordered-set

#c #Бесплатно #неупорядоченный набор

Вопрос:

Интересно, как освободить память, которую занял std::unordered_set?

Я думаю, что unordered_set::clear() просто очистит набор, не освобождая память.

Мне нужно освободить хранилище unordered_set с помощью локальной функции. Каждый раз, когда я вызываю локальную функцию, она будет потреблять некоторое количество памяти, поэтому мне нужно освободить ее в конце локальной функции.

Спасибо

Комментарии:

1. Является unordered_set локальной для функции? Если это так, то его память будет корректно освобождена в конце функции без необходимости делать что-либо вообще.

Ответ №1:

Обычный способ очистки памяти unordered_set тот же, что и для любого стандартного контейнера:

 set = std::unordered_set<T>()
  

Вы также можете использовать:

 std::unordered_set<T>().swap(set)
  

какой был обычный способ освободить память из контейнеров в дни, предшествовавшие ссылкам r-value.

Вы должны заменить T типом объектов, содержащихся в наборе.

Комментарии:

1. когда я делаю это: std::tr1::unordered_set::swap(_closelist); он показывает ‘error: ‘template<class _Value, class _Hash, class _Pred, class _Alloc> класс std::tr1::unordered_set’ используется без параметров шаблона’ и когда я делаю _closelist.swap(std::tr1::unordered_set()); он показывает error: missing template arguments before '(' token

2. Извините… Я опустил часть примера. Вам нужно будет указать параметр шаблона в unordered_set (см. Редактирование).

3. то есть, по сути, мы присваиваем набору новый пустой тип? Я думаю, что моя память не освобождена ….. я делаю <pre><code>std::tr1::unordered_set<std::tr1::array<int, 16> >().swap(_closelist); _closelist = std ::tr1::unordered_set<std::tr1::array<int, 16> >();

4. Я тестирую его с помощью этого кода, он использует 2,7 ГБ памяти, но свободен только до 2,5 ГБ code //test free set// std::tr1::unordered_set<std::tr1::array<int, 16> >_closelist; for(i =0; i<30000000; i ) { std::tr1::array<int, 16> test = {9,8,3,7,2,1,6,10,5,13,0,4,12,15,14,i} ; _closelist.insert(тест); } std::tr1::unordered_set<std::tr1::array<int, 16> >().swap(_closelist); printf(«хахахахахахахахаха»); code

5. Вам не нужно делать оба std::tr1::unordered_set<std::tr1::array<int, 16> >().swap(_closelist); и _closelist = std::tr1::unordered_set<std::tr1::array<int, 16> >(); . Любой вариант сам по себе подойдет. Хотя вы правы. Это не гарантированно приведет к тому, что unordered_set у которого вообще не будет памяти. Что это сделает, так это уменьшит потребление памяти до небольшого начального потребления памяти для построенного по умолчанию unordered_set объекта, которое должно быть значительно меньше, чем потребление памяти для объекта, unordered_set содержащего много элементов.

Ответ №2:

unordered_set автоматически освобождает занимаемую память, если она находится в стеке:

 void some_function()
{
    unordered_set<int> set;
    // use the set
} // set memory will be deallocated automatically here
  

Ответ №3:

Набор является контейнером на основе узлов, поэтому память для узлов действительно освобождена должным образом. Но поскольку хэш-таблица, возможно, увеличилась до многих сегментов, вы могли бы попробовать rehash(1) снова уменьшить ее размер — но это только подсказка; набор не требуется для уменьшения количества сегментов.

Комментарии:

1. Мне нужно освободить хранилище unordered_set с помощью локальной функции. Каждый раз, когда я вызываю локальную функцию, она будет занимать некоторое количество памяти, поэтому мне нужно освободить ее в конце локальной функции.