C++ 使用std::map时的内存增长

C++ 使用std::map时的内存增长,c++,C++,我观察到这段代码的内存增长。但是它应该不会显示内存增长,因为所有创建的对象都被删除了 我已经为MyObj实现了析构函数,并通过gdb观察到,当映射被迭代时,析构函数实际上被调用。 有人能解释一下我哪里做错了吗 map<int,MyObj*> myMap; for(int i = 1; i<= 500000; i ++) { MyObj* pMyObj = new MyObj; myMap.insert(pair<int,MyO

我观察到这段代码的内存增长。但是它应该不会显示内存增长,因为所有创建的对象都被删除了

我已经为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();
map-myMap;
对于(int i=1;等秒;
ite++;
}
myMap.clear();
您可能需要阅读。 特别是最后几段:

有时,free实际上可以将内存返回到操作系统 并且使过程更小。通常,它所能做的就是允许更晚的时间 调用malloc重新使用该空间。同时,该空间仍然保留 作为malloc内部使用的免费列表的一部分在您的程序中


如果要大内存块返回操作系统,请考虑使用<代码> MMAP .< /P>这里有很多副本,因此(也应该很容易通过简单的搜索在Internet上找到解释)。操作系统不必取消映射内存页,以防您的进程再次需要它们。如果操作系统在其他地方需要这些页,它将取消映射它们和您的“增长”将消失。@JoachimPileborg如果我在新代码之后进行删除写入,它将永远不会出现。感谢您的快速回复。@chieftwoils在执行这段代码之前和之后。您看到的大致内存是多少?MyObj有多大?嗨,如果我只声明一个空映射对象(如map idx_to_Objp;),那么,就在这个声明之后,它在堆栈中有空间吗?我的意思是在向它添加任何值之前。(但从上面看,它听起来像是map在堆上有空间)。-哦,我刚刚发现map是在堆上分配的。