Как освободить память из std :: deque? - PullRequest
9 голосов
/ 07 августа 2009

Я использую std::deque для хранения довольно большого количества объектов. Если я удаляю кучу этих объектов, мне кажется, что использование памяти не уменьшается, подобно std :: vector.

Есть ли способ уменьшить его? Я знаю, что в векторе вы должны использовать «трюк подкачки», который, я полагаю, будет работать и здесь, но я бы предпочел этого избегать, поскольку это потребовало бы копирования всех элементов, оставшихся в контейнере (и, следовательно, требует, чтобы достаточно памяти для хранения каждого объекта дважды). Я не очень хорошо знаком с реализацией deque, но, насколько я понимаю, можно добиться такой цели без большого количества копий (тогда как с вектором это явно не так).

Я использую VC ++ (Dinkumware) STL, если это что-то меняет.

Ответы [ 4 ]

15 голосов
/ 07 августа 2009

Нет способа сделать это напрямую в std :: deque. Тем не менее, это легко сделать с помощью временного (что обычно происходит в std :: vector при уменьшении его емкости).

Вот хорошая статья о std :: deque , сравнивающая ее с std :: vector. В самом низу показан чистый способ замены и сжатия вектора, который также работает с deque.

4 голосов
/ 29 апреля 2011

Как добавить информацию к этому:

В C ++ 0x / C ++ 11, deque (и несколько других контейнеров) имеет новую функцию под названием «shrink_to_fit», которая удаляет лишние элементы и в основном выравнивает емкость () == size ()

4 голосов
/ 07 августа 2009

Объем памяти deque может уменьшиться или не уменьшиться. Когда и Как это происходит, зависит от конкретной реализации. К сожалению, у вас нет большого ручного управления этим, поскольку у deques нет даже способности () или резерва ().

Я бы предложил swap (), если вы действительно обнаружите, что освобождение памяти не выполняется по вашему усмотрению.

Интимные знания об управлении памятью deque, вероятно, можно получить на веб-сайте Dikum (это ваша текущая реализация, верно?)

1 голос
/ 07 августа 2009

std :: deque вернет память своему распределителю. Часто этот распределитель не возвращает память в ОС. В таких случаях кажется, что память не «освобождена». Хорошие детекторы утечки памяти будут удовлетворены, как только память будет возвращена распределителю, и поймут, что не вся память освобождается free().

...