直到程序退出,Std::deque才释放内存
Std::deque does not release memory until program exits
在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项目。
相关文章:
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- 在将变量声明为引用时,堆在释放后使用
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- Capacity of a deque
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- C++双重释放或损坏(out)
- 如何在c++中释放内存
- 使用全局声明的向量时,C++双重释放错误/损坏
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 调用析构函数以释放动态分配的内存
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- COM :是否可以查看是否存在对我的某个 COM 对象的进程外引用?我可以释放它吗?
- 如何在向量中释放指针?
- std::unordered_map析构函数不释放内存?
- 在C++中释放内存期间,迭代器与指针有何不同
- 包含矢量指针的结构的内存释放问题
- C++:在被本地字符串捕获后释放或销毁 malloc'd char *?
- 直到程序退出,Std::deque才释放内存