Как освободить память от std:: deque?
Я использую std::deque
для хранения довольно большого количества объектов. Если я удалю кучу этих объектов, мне кажется, что ее использование памяти не уменьшается, аналогично std::vector.
есть ли способ уменьшить это? Я знаю, что в векторе вы должны использовать 'своп трюк, который я предполагаю, что будет работать здесь, но я предпочел бы избежать этого, поскольку это потребует, чтобы скопировать все элементы в контейнере (и, следовательно, необходимо иметь достаточно памяти для храните каждый объект дважды). Я не очень хорошо знаком с реализацией deque, но мое понимание этого заключается в том, что можно достичь такой вещи без большого количества копий (в то время как с вектором это явно не так).
Я использую STL VC++ (Dinkumware), если это имеет значение.
4 ответов
нет способа сделать это непосредственно в std:: deque. Однако это легко сделать с помощью временного (что в основном происходит в std:: vector при сжатии его емкости).
здесь хорошая статья о std:: deque, сравнивая его с std:: vector. В самом низу показан чистый способ замены и сжатия вектора, который работает одинаково с deque.
размер памяти deque может уменьшаться или не уменьшаться. , когда и Как это происходит в конкретной реализации. К сожалению, у вас нет ручного управления этим, так как deques не хватает даже capacity () или reserve ().
Я бы предложил swap (), если вы действительно обнаружите, что освобождение памяти не выполняется в удобное для вас время.
интимные знания управления памятью deque, вероятно, можно получить на веб-сайте Dikum (это ваш текущая реализация, верно?)
Как добавлена информация к этому:
В C++0x / c++11 deque (и несколько других контейнеров) имеет новую функцию под названием "shrink_to_fit", которая удалит лишние элементы и в основном выровняет capacity () = = size ()
std:: deque вернет память своему распределителю. Часто этот распределитель не возвращает память в ОС. В таких случаях кажется, что память не "освобождается". Хорошие детекторы утечки памяти будут удовлетворены, как только память будет возвращена распределителю, и поймите, что не вся память освобождается free()
.