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不会在它们之间重用。


网友回复:既然这样我就放心了
谢谢以上各位的解答,
结帖

原创粉丝点击