在程序退出之前,Std :: deque不会释放内存

时间:2011-04-29 16:32:47

标签: c++ stl deque

在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 个答案:

答案 0 :(得分:17)

这是正确的,pop_front()不会释放由push_back()分配的存储空间 如果要在程序结束前解除分配,可以结束对象的生命周期。如果要在对象的生命周期结束之前解除分配,请考虑对C ++容器类使用“shrink-to-fit”惯用法。

QueueType().swap (deq); // C++98
deq.shrink_to_fit(); // C++11

答案 1 :(得分:0)

How to release memory from std::deque?上复制来自MSalters的回复(感谢Emile Cormier提供的链接)。

“std :: deque会将内存返回给它的分配器。通常这个分配器不会将内存返回给操作系统。在这种情况下,看起来好像内存没有”释放“。好的内存泄漏检测器会满足只要内存返回到分配器,并且了解并非所有内存都由free()释放。“

所以即使它释放内存,它也不会真正释放内存。这很容易被视为不合理的行为,除非程序中的所有分配都由STL执行;相当自恋的图书馆。因此,请考虑覆盖任何内存密集型数据结构的分配器,以改善控制。其他人发现STL分配器系统也缺乏 - 参见Electronic Arts的EASTL项目。