免费注册 查看新帖 |

Chinaunix

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

c hash链表 释放空间的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-27 17:12 |只看该作者 |倒序浏览
hash.tar (20 KB, 下载次数: 83) 写的一个hash链表,申请了1000000个桶里面放500000条数据,然后查询,删除,最后释放链表 hash_close。
可是在本进程退出之前,明明已经释放了所有的申请空间,但是本进程还是占了40M内存(用free -m看到的),
但是用valgrind检测:
#valgrind --tool=memcheck --leak-check=full -v ./hash_test
结果是:
==8627== HEAP SUMMARY:
==8627==     in use at exit: 0 bytes in 0 blocks
==8627==   total heap usage: 1,500,005 allocs, 1,500,005 frees, 58,777,857 bytes allocated
==8627==
==8627== All heap blocks were freed -- no leaks are possible
==8627==
==8627== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 3 from 3)
--8627--
--8627-- used_suppression:      3 dl-hack3-cond-1
==8627==
==8627== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 3 from 3)
提示没有内存泄露。

这是怎么回事啊?
已经附上源码。

论坛徽章:
0
2 [报告]
发表于 2011-04-28 09:27 |只看该作者
本帖最后由 hebingyue 于 2011-04-28 10:34 编辑

代码不到300行,里面有编译脚本,热心的cu们,测试下吧,在此谢过。。
跟踪代码到 elf_hash.c文件中:
259                 free_list_node( tmp );
释放hash节点,注释和不注释占用内存没有变化,感觉是释放没起作用。
我的做法是先定位到双向链表尾部,从后往前删除。
明明已经调用释放,为什么没起作用?

论坛徽章:
0
3 [报告]
发表于 2011-04-28 12:23 |只看该作者
有可能是上百万次 malloc 和 free 造成内存碎片?但是内存碎片也应该是空闲的,而不是算到本进程下?

论坛徽章:
0
4 [报告]
发表于 2011-04-29 16:22 |只看该作者
第一次发帖竟然这么冷清,是我问题没有描述明白呢,还是提问方式不对啊。

论坛徽章:
0
5 [报告]
发表于 2011-04-29 17:58 |只看该作者
最近进行了一些测试:
得出以下结论
1、代码本身没有内存泄露,valgrind检测结果是对的。
2、造成进程占用内存虚高的原因是 malloc分配调用sbrk系统调用实现,该系统调用扩充(或缩小)本进程的堆。
虽然sbrk可以扩充或缩小进程堆空间,但大多数malloc和free的实现都不减少进程的存储空间(特殊情况下会减少,
见第三点)。释放的空间可供以后再分配,但通常将他们保持在malloc池中而不返给内核。(参考 unix环境高级
编程 7.8节,155页)
3、那要是在使用过程中频繁申请了大量内存,后续不再使用,但进程常驻内存,内存块是不是永远被本进程锁定呢?
由于前面的链表节点都是40~50个字节,因此造成大量小块内存没有返还内核并回收,估计频繁回收对内核也是个挑战。
我测试发现了一个方法,在释放后申请一个稍大的内存块(比如 100K),然后把其释放掉,
这样触发了内存回收机制(猜测的,没有确认),把前面申请到的大片小内存块给一起回收了。
内存又回来啦.....

论坛徽章:
0
6 [报告]
发表于 2011-05-02 18:13 |只看该作者
只要申请一次就足够了

论坛徽章:
0
7 [报告]
发表于 2011-05-02 18:16 |只看该作者
只要申请一次就足够了

论坛徽章:
0
8 [报告]
发表于 2011-05-11 17:41 |只看该作者
其实这也说明了为什么申请的小块内存free后,指针还可以使用。因为申请的空间太小了,系统没必要立即回收到内核,暂时放在本进程空间,但这段内存随时可能被再次申请使用。
所以指针释放后,再次使用就像抱者yk炸弹,随时可能crash.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP