免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: HJLin
打印 上一主题 下一主题

[C++] c++ allocator 内存释放问题,急 [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
11 [报告]
发表于 2009-08-15 00:25 |只看该作者

回复 #9 HJLin 的帖子

原帖由 HJLin 于 2009-8-15 00:09 发表
程序中注释掉的部分,new char[] 然后delete 有可能会把资源释放掉


是有可能, 还是确实会?


要不你再做一个测试吧:

for (int i = 0;i<12;++i) {
    char* p = new char[1212*1212*26];
    printf("%p\n",(void*)p);
    delete [] p;
    (void)getchar(); // 是不断递增呢, 还是保持稳定
}
(void)getchar(); // 有没有被回收

论坛徽章:
0
12 [报告]
发表于 2009-08-15 00:43 |只看该作者

回复 #10 kouu 的帖子

我有例子啊,你可以试下啊!!!!!
现在就是存在这样的情况,麽有资源泄漏,没有心new出来的小内存。
通过我注释掉的代码你可以跑跑看和gdb

继续等待中。。。

论坛徽章:
0
13 [报告]
发表于 2009-08-15 00:49 |只看该作者

回复 #11 OwnWaterloo 的帖子

内存没有一直增加,释放增加的不断过程。getchar 没有没有关系,即使它可能会new空间的话,它自己也会释放它的!

我觉得这个问题不能光靠分析,实际试试运行可能更有效果

论坛徽章:
0
14 [报告]
发表于 2009-08-15 00:58 |只看该作者
完会游戏睡觉,明天继续!!多谢大家支持

论坛徽章:
0
15 [报告]
发表于 2009-08-15 01:11 |只看该作者

回复 #12 HJLin 的帖子

呵呵, LZ的例子我跑了一下,并且把size增大了10倍。

如果后面的new p / delete p的代码没有被注释掉, 随着p的释放, 在堆上为vec分配的那些内存都会归还内核。
如果注释掉,则这些堆空间还是一直不会归还…… 确实很神奇……

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
16 [报告]
发表于 2009-08-15 01:19 |只看该作者

回复 #13 HJLin 的帖子

原帖由 HJLin 于 2009-8-15 00:49 发表
内存没有一直增加,释放增加的不断过程。

那你也没什么好怀疑的了……

1. operator new, operator delete
上面测了。

2. allocator
虽然allocator调用op new, op delete的时机、次数未知, 但vector, string析构的时候, 调用deallocate却是一定的。
更上面那个117有关的, 也测了。


它们确实没有泄露, 只是可能没有归还而已。 c++真没动什么手脚……

原帖由 HJLin 于 2009-8-15 00:49 发表
getchar 没有没有关系,即使它可能会new空间的话,它自己也会释放它的!

我写getchar嘛 ……  为的是可以等待一下 ……
为什么你对getchar可以如此信任, 对c++ , operator new, operator delete, allocator 不信任呢 ……

它们都“释放”了的, 只是可能没归还而已。



原帖由 HJLin 于 2009-8-15 00:09 发表
减少峰值的话确实可以办到

要解决问题, 就只能这样。 强制归还也没用。


原帖由 HJLin 于 2009-8-15 00:09 发表
但是现在发现了问题。不仅仅是为了解决问题而解决问题。
我是比较想弄清底层运作的人了

就冲你这2句话,  我再多说几句 ……

win32下, 最底层的分配就是VirtualAlloc了。 以page大小的整数倍为单位。
类unix上我不清楚了。 mmap吗?

C库的malloc, calloc, realloc, free, 就是将这种整块整块的内存管理起来, 再小块小块分配给调用xalloc,的用户。
用户free(ptr)的时候, 并不一定能恰好使得ptr所在的page全部空闲, 这时候, 显然是不能将该page归还。
即使用户若干次使用free, 并且某次使用 free(p)时, p所在的page确实全部没有使用了, 该page可以归还给OS。
但C库不一定会这样做, 它可能只是标记该page未使用、不归还,并供以后使用。
或者, 再折中一点, 空闲page比较多, 甚至连续的时候, 考虑归还一部分。 (win32上比较麻烦, 分了保留与提交, 前者以64k为粒度,后者以page为粒度……)

所以fun返回调用的时候, 117M依然被“使用”, 它被某个层次的分配器"使用", 也许是allocator, 或者 op new, op delete, 或者 xalloc,free。
但没有"泄露", 依然被"管理"。 反复调用fun没有继续增长就可以说明。


所以, 如果lz想强制归还,要么, 去查你使用的crt是否提供了这种函数; 要么, 就自己实现分配器, 就保证能强制归还了(所以我说代价很高, 不值得这样做)。

论坛徽章:
0
17 [报告]
发表于 2009-08-15 23:50 |只看该作者
有人解释下么?

论坛徽章:
0
18 [报告]
发表于 2009-08-16 03:11 |只看该作者
LZ 不明白你是怎麼測的內存耗用量.好像和C++無關吧,學習一下LINUX內存管理吧.

http://www.eygle.com/digest/2007 ... agement_or_why.html

聽起來,LZ的程序對於內存用量很大.可以試試多進程調用或者優化你的程序把string管理起來.

[ 本帖最后由 dtimes6 于 2009-8-16 03:19 编辑 ]

论坛徽章:
0
19 [报告]
发表于 2009-08-17 10:43 |只看该作者
多谢大家支持,现在我想知道的问题就是。我给的代码fun函数结束了,为什么临时变量vector里面的string的内存没有归还给系统。为什么我在后面加了个new delete 之后就归还了!
跟其他无关

论坛徽章:
0
20 [报告]
发表于 2009-08-17 11:18 |只看该作者
和C++无关。
func()返回后117M不会立即归还OS的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP