免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 21189 | 回复: 27
打印 上一主题 下一主题

[C++] 如何让 STL 确实释放内存 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-31 19:48 |只看该作者 |倒序浏览
我使用的 STL map 在 delete 后, 内存不释放(从操作系统的角度). 我知道这是一个 expected behavior, 不过, 对于我的应用, 这是一个问题. 因为我的程序在运行时初始化, STL 需要使用大量的内存, 之后的长时间执行, 只需要很少的内存. 如果 STL 不释放这些内存, 别的进程就不能使用.

如下代码:

  1. map<int,int> *m = new map<int,int>();
  2. int loop = 1024*1024*16;
  3. for(int i=0;i<loop; i++){
  4.     (*m)[i] = i;
  5. }
  6. // A: 这里观察到内存被占用很多.
  7. getchar();
  8. delete m;
  9. // B: 这里观察到内存没被释放.
  10. getchar();

  11. // 之后是主要工作, 只需要很少的内存.
复制代码


所以, 我的问题是: 如何在 delete m 后, 让 STL 释放掉内存给操作系统的其它进程使用?

[ 本帖最后由 ideawu 于 2008-6-2 21:20 编辑 ]

论坛徽章:
39
2017金鸡报晓
日期:2017-02-08 10:39:4219周年集字徽章-周
日期:2023-04-15 12:02:2715-16赛季CBA联赛之深圳
日期:2023-02-16 14:39:0220周年集字徽章-年
日期:2022-08-31 14:25:28黑曼巴
日期:2022-08-17 18:57:0919周年集字徽章-年
日期:2022-04-25 13:02:5920周年集字徽章-20	
日期:2022-03-29 11:10:4620周年集字徽章-年
日期:2022-03-14 22:35:1820周年集字徽章-周	
日期:2022-03-09 12:51:3220周年集字徽章-年
日期:2022-02-10 13:13:4420周年集字徽章-周	
日期:2022-02-03 12:09:4420周年集字徽章-20	
日期:2022-01-25 20:14:27
2 [报告]
发表于 2008-05-31 21:42 |只看该作者
m->clear();
delete m;

论坛徽章:
0
3 [报告]
发表于 2008-05-31 21:46 |只看该作者
看内存分配器怎么做。 我记得stl 有一个内存分配的对象的。 clean 也只是归还给那个池。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2008-05-31 22:00 |只看该作者
(*m) = i;

[ 本帖最后由 cookis 于 2008-5-31 22:01 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-05-31 22:11 |只看该作者
原帖由 醉卧水云间 于 2008-5-31 21:42 发表
m->clear();
delete m;

谢谢回复. 不过, 这样做没有效果. 原因如3楼朋友说的.

论坛徽章:
0
6 [报告]
发表于 2008-05-31 22:16 |只看该作者
原帖由 benjiam 于 2008-5-31 21:46 发表
看内存分配器怎么做。 我记得stl 有一个内存分配的对象的。 clean 也只是归还给那个池。

是的. 查到的资料都说要自己写一个内存分配器. 我用的是 HP 的STL 实现, 不知道它有没有自带一个不使用内存池的分配器吗? 还是它提供了某个接口, 减少内存池的大小?

论坛徽章:
0
7 [报告]
发表于 2008-05-31 22:56 |只看该作者
LZ,使用delete肯定能释放内存,不知道你怎么观察的?在什么系统上?

除了动态分配/释放,还可以使用swap惯用法来释放内存:


  1. map<int,int> m;
  2. int loop = 1024*1024*16;
  3. for(int i=0;i<loop; i++){
  4.     m[i] = i;
  5. }

  6. map<int, int>().swap(m);
复制代码

论坛徽章:
0
8 [报告]
发表于 2008-05-31 22:59 |只看该作者
不过,在我的机器上分配这么大的内存吃不消
我用int loop = 1024*1024*1;都占用了75M,如果用*16我机器估计挂了

论坛徽章:
0
9 [报告]
发表于 2008-05-31 23:00 |只看该作者
原帖由 醉卧水云间 于 2008-5-31 21:42 发表
m->clear();
delete m;

clear()只是删除元素,但不会回收空间,只有map对象被析构时才会回收空间,所以前面那个clear是多余的

论坛徽章:
0
10 [报告]
发表于 2008-05-31 23:28 |只看该作者
原帖由 tyc611 于 2008-5-31 22:56 发表
LZ,使用delete肯定能释放内存,不知道你怎么观察的?在什么系统上?

除了动态分配/释放,还可以使用swap惯用法来释放内存:
map m;
int loop = 1024*1024*16;
for(int i=0;i

我在Windows XP下, 用系统自带的监视器查看. 如果用 VC6 来编译上面的程序, 可以观察到 delete m 后, 系统内存占用明显下降. 用 cygwin 环境时, 是贴子中的情况.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP