map清空是否不会释放内存?

allenpony 2012-04-06 10:06:41
我有个程序,不断的往一个MAP里插数据,当判断插入10万个的时候输出数据然后清空MAP,但是实际使用中发现程序所耗的内存一直在增加,是否因为clear不会清空内存?要怎么实现固定大小的内存占用呢?
例如程序片段如下
map<int,int> mm;
for (int j=1;;j++)
{
mm[j] = j+1;
if (j>100000)
mm.clear();
}

...全文
13468 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
allenpony 2012-04-09
  • 打赏
  • 举报
回复
补充一点,清掉MAP不会释放内存给OS,而会给进程下次使用时用。比如我的进程占了400M内存,clear掉map再往map里Insert的话,进程的占用的内存还是400,不会改变,只有退出进程后才会将他还给OS。谢谢各位,结贴了
Jim_King_2000 2012-04-06
  • 打赏
  • 举报
回复
我用visual studio 11 beta看了一下,内存在clear的时候会下来,swap也会下来。不知道LZ用的是哪款编译器。
allenpony 2012-04-06
  • 打赏
  • 举报
回复
可否用内存池实现?有人知道这方面的知识么?比如定义一个map,他使用内存池的内存而不是系统的。
allenpony 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
一般使用clear是无法释放内存的。swap据说可以,但我经过试用好像也不行。。。
[/Quote]
试了swap,没用,最后都报申请不到内存了。另,我的map都是string类型的
cattycat 2012-04-06
  • 打赏
  • 举报
回复
这个如果你map中元素是指针,而且new出来的,得delete这些对象。至于map会自己释放掉。操作系统可能在需要的时候回收内存,也许不是立即就能看到效果。
allenpony 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
C/C++ code

for (int j=1;;j++)
{
mm[j] = j+1;
if (j>100000)
{
mm.clear();
j = 1;
}
}
[/Quote]

这里我只是举例,并不是真正代码就是这样的。而且j是节点值,所以J=1这样写我认为是没有意义的。
刚查了下,map的clear只是把内存还给了堆,并没有还给OS,所以进程占用内存会一直增加
melos 2012-04-06
  • 打赏
  • 举报
回复
一般使用clear是无法释放内存的。swap据说可以,但我经过试用好像也不行。。。
Jim_King_2000 2012-04-06
  • 打赏
  • 举报
回复
Hurb Sutter在书上说,如果你一定要放光所有内存,可以使用create & swap pattern。

mm.swap(map<int,int>());


不过一般而言,没必要这么做。mm在析够的时候就会放光所有内存。
wb_rock 2012-04-06
  • 打赏
  • 举报
回复
如果map里边元素是new出来的,就需要自己手动释放
pengzhixi 2012-04-06
  • 打赏
  • 举报
回复
额 ,map自己的内存管理不用你担心。你只需要管好你自己new的内存即可
youou0011 2012-04-06
  • 打赏
  • 举报
回复

for (int j=1;;j++)
{
mm[j] = j+1;
if (j>100000)
{
mm.clear();
j = 1;
}
}

allenpony 2012-04-06
  • 打赏
  • 举报
回复
问题是他所占用的内存会一直增加,这不是我想要的
hkhaik 2012-04-06
  • 打赏
  • 举报
回复
不是new的不需要你手动释放内存
等待风的猪 2012-04-06
  • 打赏
  • 举报
回复
改为这样就可以了。

map<int,int> mm;
for (int j=1;;j++)
{
mm[j] = j+1;
if (j>100000)
mm.clear();
j=0;
}

allenpony 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
gcc 4.1
用clear,测试内存不会一直增长,lz的具体环境是?或者换个思路,限定对象的声明周期

C/C++ code

#include <iostream>
#include <map>
using std::map;
using std::cout;
using std::endl;

const size_t iMapSize = 2000000;
typ……
[/Quote]

解决了,是程序本身有个BUG,我CLEAR之前有对数量的判断,
for(int i=0;;i++)
{
if (fileCount==2000000)
{
iRet=output_map(mm_);
mm_.clear();
fileCount=0;
if (iRet!=0) return -1;
}
fileCount++;
}
原来没有加fileCount=0,导致第一次执行之后一直进不到IF里清空MAP。不过观察TOP发现MAP清掉了不会马上释放给OS。谢谢各位啦。
delphiwcdj 2012-04-06
  • 打赏
  • 举报
回复
gcc 4.1
用clear,测试内存不会一直增长,lz的具体环境是?或者换个思路,限定对象的声明周期

#include <iostream>
#include <map>
using std::map;
using std::cout;
using std::endl;

const size_t iMapSize = 2000000;
typedef map<int, int>::const_iterator ITER_MAP;
void Printer(map<int, int> &mm)
{
#if 0
ITER_MAP iter = mm.begin();
for (; iter != mm.end(); ++iter)
{
cout << iter->first << " " << iter->second << endl;
}
#endif
cout << "end" << endl;
}

int main()
{
for (;;) {

map<int, int> mm;
sleep(3);

for (int i = 1; ; ++i)
{
mm[i] = i + 1;

if (mm.size() == iMapSize)
{
Printer(mm);
break;
}
}
}
}
Jim_King_2000 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 12 楼 的回复:
我用visual studio 11 beta看了一下,内存在clear的时候会下来,swap也会下来。不知道LZ用的是哪款编译器。

linux下的G++
[/Quote]
现在手边没有Linux,晚上帮你看看。
allenpony 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]
你怎么知道所耗的内存一直在增加?
[/Quote]
TOP看的啊,最后程序日志也会打印bad allocation的
aaseh 2012-04-06
  • 打赏
  • 举报
回复
你怎么知道所耗的内存一直在增加?
allenpony 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
我用visual studio 11 beta看了一下,内存在clear的时候会下来,swap也会下来。不知道LZ用的是哪款编译器。
[/Quote]
linux下的G++

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧