6

在 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;
}
4

2 回答 2

19

这是正确的,pop_front()不释放分配的存储push_back() 如果你想在程序结束之前释放它,你可以结束对象的生命周期。如果您想在对象的生命周期结束之前释放它,请考虑对 C++ 容器类使用“缩小以适应”习语。

QueueType().swap (deq); // C++98
deq.shrink_to_fit(); // C++11
于 2011-04-29T16:36:54.493 回答
0

复制 MSalters 关于如何从 std::deque 释放内存的响应?(感谢 Emile Cormier 的链接)。

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

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

于 2015-07-07T11:00:27.487 回答