2015-10-23 54 views
1

我正在用这段代码观察内存的增长情况。但它应该显示没有内存增长,因为所有创建的对象都被删除。使用std :: map时的内存增长

我已经实现了MyObj的析构函数,并用gdb观察到迭代地图时实际调用析构函数。 有人可以解释我在做错什么。

map<int,MyObj*> myMap; 

for(int i = 1; i<= 500000; i ++) 
    { 
     MyObj* pMyObj = new MyObj; 
     myMap.insert(pair<int,MyObj*>(i,pMyObj)); 

    } 

map<int,MyObj*>::iterator ite = myMap.begin(); 
while (ite != myMap.end()) 
{ 

    delete ite->second; 
    ite++; 
} 

myMap.clear(); 
+2

这里有很多重复的SO(并且应该很容易通过简单的搜索在互联网上找到解释)。 “问题”的一个可能原因是操作系统不必取消映射内存页面,以防您的进程再次需要它们。如果操作系统需要其他地方的页面,它将取消映射它们,你的“增长”将消失。 –

+0

@JoachimPileborg如果我做了删除写之后,它永远不会发生。感谢您的快速回复。 –

+0

@ChiefTwoPencils在执行这段代码之前和之后.. –

回答

1

您可能想要阅读http://www.gnu.org/software/libc/manual/html_node/Freeing-after-Malloc.html#Freeing-after-Malloc。 尤其是最后一段:

偶尔,免费其实可以返回内存操作系统 ,使过程更小。通常,它所能做的只是允许稍后调用malloc以重新使用空间 。与此同时,程序中的空间仍然是 ,作为malloc内部使用的自由列表的一部分。

如果要将大块内存返回到操作系统,请考虑使用mmap

+0

嗨,如果我只是声明一个空的地图对象(如地图 idx_to_Objp;),那么,在这个声明之后,它是否在堆栈中有空间?我的意思是在添加任何值之前。 (但是从上面看,这听起来像地图在堆上有空间)。 - 哦,我刚刚发现地图分配在堆上。 –