stl作为局部变量的内存问题
来源:互联网 发布:属于网络层协议的是 编辑:程序博客网 时间:2024/04/20 20:21
- C/C code
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/void func(){ map<int,int>m; for(int i=0;i<0xffffff;i ) m.insert(make_pair(i,i));}
以上函数中,m是局部变量,
但是func函数返回时并没有释放内存
我猜测是因为make_pair的内存是在堆上分配的
请问怎样写才能在退出函数时自动释放内存?
网友回复:根据???
网友回复:我观察windows资源治理器发现跳出函数的时候内存没有减少
同样的代码,把map换成vector就没有这个问题
网友回复:跟踪下不就知道了
网友回复:make_pair的内存是在堆上分配的
显然不对,是存在栈里面的,退出函数作用域自动释放
网友回复:那我上面说的问题是怎么回事呢,
用资源治理器看,单步执行状态下,确实函数返回时内存不减少,而用vector就会恢复到调用前的内存
调试手段我还不太熟
我用的stlport,vs2005下面
网友回复:似乎会自动释放吧!
网友回复:没有吧,在我的机器上很明显,而且根本不用0xffffff,四个f就够明显了。
网友回复:你单步跟踪的时间,跟到函数的闭括号时,对于调试器来说,那个“位置”是局部变量析构之前的执行点。你应该在此时观察一下内存,然后从函数跳出后,再观察一下内存,应该有区别的。
网友回复:map在析构的时候会释放自己分配的内存。
原因在于你用的是stlport,stlport中使用的memory pool来分配内存,因此,map释放的内存并没有进入系统,而是被stl的memory port进行治理。内存没有真正的释放,但是是不会造成内存流失的。
网友回复:stlport是什么东西?是不是土了?呵呵。
网友回复:Polarislee 说的似乎是对的吧
我试着多次调用上面那个函数
发现后面几次并没有增加程序占用的内存。
但是还发现个问题,就是map释放的内存无法被vector使用
如下
- C/C code
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/#include <vector>#include <map>using namespace std;void func2(){ vector<double>v; for(int i=0;i<0x7ffff;i ) v.push_back(i); system("pause");}void func1(){ map<int,int>m; for(int i=0;i<0x7ffff;i ) m.insert(pair<int,int>(i,i-1)); system("pause");}int main() { func1(); func2(); system("pause"); return 0 ;}
只调用func1时消耗约4M内存
只调用func2时消耗15M
先调用1再调用2时18M
map分配的内存不能被vector使用岂不根内存泄露差不多了
网友回复:"map分配的内存不能被vector使用岂不根内存泄露差不多了 "
只是不能被你现在这个大小的vector使用而已。
你现在只要知道,stl这么使用不存在内存泄漏 就可以了。
具体更细节问题,等你有实力研究《STL源码剖析》后也许会明白。
网友回复:vector <double>和map <int, int>的每个元素尺寸不一样,因此,除非系统内存已经耗尽,stl的memory port不会在它们之间重用。
网友回复:既然这样我就放心了
谢谢以上各位的解答,
结帖
- stl作为局部变量的内存问题
- 局部变量作为返回值问题
- stl中string作为成员变量引起的core问题
- stl中string作为成员变量引起的core问题
- 指针作为局部变量的注意事项
- 作为局部变量的std::string和标准库容器一种内存优化方法
- C++中的对象作为局部变量时的析构问题
- 返回局部变量的问题
- 返回局部变量的问题
- 返回局部变量的问题
- 返回局部变量的问题
- 返回局部变量的问题
- 返回局部变量的问题
- 返回局部变量的问题
- 返回局部变量的问题
- 静态局部变量的问题
- Java中隐藏的this变量和局部变量可能引发的内存泄露问题
- 局部变量作为返回值
- SAP中PATH和TCODE的相互查找
- HTTP请求模型和头信息
- 第七章 使用结构组合数据
- socket 发送http请求
- J2EE教学体会
- stl作为局部变量的内存问题
- 风险投资=骗子?
- Symbian GUI 应用资源文件介绍 zz
- 如何隐藏win32 console application的console窗口
- SAP 标准倒EXCEL的FM
- 通过阵地攻坚战谈项目调研的方法
- 主流搜索引擎对用户点选命中的处理
- API 层实现语音录制
- HashSet中equals()与hashCode()方法的重写