在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;
}
答案 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项目。