Std :: deque не освобождает память до выхода из программы - PullRequest
5 голосов
/ 29 апреля 2011

В linux std :: deque не освобождает память до выхода из программы. Полный код ниже. Любая помощь будет принята с благодарностью!

#include <deque>
#include <vector>
#include <string>
#include <iostream>
#include <boost/shared_ptr.hpp>
#include <queue>
#include <list>
#include <cstdio>
#include <cstdlib>

typedef  boost::shared_ptr<std::vector<int> > VecPtr;
typedef  std::deque< VecPtr  > QueueType;

 char buf[1024];
 char line[1024];

 int main()
 {

  {

    int v=0;
    QueueType  deq;
    for(int i=0; i<30;++i)
    for(int j=0; j<1000;++j)
    for(int k=0;k<1000;++k)
    {
       VecPtr p( new std::vector<int>);
       deq.push_back(p);
    }

    std::cout<<"Done with increasing deq:deq size="<<deq.size()<<std::endl;
    sleep(20);

    std::cout<<"start decreasing deq size"<<std::endl;
    while(deq.size()>0)
    {
      deq.pop_front();
    }
    std::cout<<"done with decreasing deq size,deq size="<<deq.size()<<std::endl;
  }
  std::cin.getline(line,sizeof(line));
  return 0;
}

Ответы [ 2 ]

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

Это правильно, pop_front() не освобождает память, выделенную push_back(). Если вы хотите освободить ее до завершения программы, вы можете закончить время жизни объекта.Если вы хотите освободить его до того, как закончится время жизни объекта, попробуйте использовать идиому « сжимаемая до 100 * *» для контейнерных классов C ++.

QueueType().swap (deq); // C++98
deq.shrink_to_fit(); // C++11
0 голосов
/ 07 июля 2015

Копирование ответа от MSalters на Как освободить память из std :: deque? (спасибо Emile Cormier за ссылку).

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

Таким образом, даже когда он освобождает память, он не освобождает память. Это легко расценить как необоснованное поведение, если только все распределение в программе не выполняется STL; скорее самовлюбленный из библиотеки. Поэтому рассмотрите возможность переопределения распределителей для любых структур данных, интенсивно использующих память, для улучшения контроля. Другие также обнаружили, что системы распределения STL не хватает - см. Проект EASTL от Electronic Arts.

...