#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 с помощью локальной функции. Каждый раз, когда я вызываю локальную функцию, она будет занимать некоторое количество памяти, поэтому мне нужно освободить ее в конце локальной функции.