直到程序退出,Std::deque才释放内存

Std::deque does not release memory until program exits

本文关键字:deque 释放 内存 Std 程序 退出      更新时间:2023-10-16

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

这是正确的,pop_front()不释放由push_back()分配的存储如果您想在程序结束之前释放它,您可以结束对象的生命周期。如果你想在对象生命周期结束之前释放它,可以考虑在c++容器类中使用"收缩到适合"的习惯用法。

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

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

"std::deque将把内存返回给它的分配器。通常这个分配器不会将内存返回给操作系统。在这种情况下,内存似乎没有被"释放"。只要内存返回给分配器,优秀的内存泄漏检测器就会感到满意,并且理解free()释放的不是所有内存。"

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