免费注册 查看新帖 |

Chinaunix

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

free的内存何时归还给系统 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-26 09:08 |只看该作者 |倒序浏览
如下代码在执行完free之后,内存会交还给系统,也就是说used在free()之后会减少很多;
如果把#if 1 改成 #if 0,则内存似乎没有还给系统。这是什么原因呢。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. #if 1
  5. #define MALLOC_BLOCK_COUNTS 1024
  6. #define MALLOC_BLOCK_SIZE  (2 * 1024 * 1024)
  7. #else
  8. #define MALLOC_BLOCK_SIZE 1024
  9. #define MALLOC_BLOCK_COUNTS  (2 * 1024 * 1024)
  10. #endif

  11. static char *ptr[MALLOC_BLOCK_COUNTS];

  12. int
  13. main(int argc, char **argv)
  14. {
  15.     long long i, j;

  16.     memset(ptr, 0x0, sizeof(ptr));
  17.     for (i = 0; i < MALLOC_BLOCK_COUNTS; i++) {
  18.         ptr[i] = malloc(MALLOC_BLOCK_SIZE);
  19.         if (ptr[i] == NULL) {
  20.             perror("malloc()");
  21.             exit(-1);
  22.         }

  23.         for (j = 0; j < MALLOC_BLOCK_SIZE; j++) {
  24.             *(ptr[i] + j) = j % 256;
  25.         }
  26.     }

  27.     for (i = 0; i < MALLOC_BLOCK_COUNTS; i++) {
  28.         free(ptr[i]);
  29.     }

  30.     printf("ok\n");
  31.     sleep(1000);
  32.     return 0;
  33. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2010-08-26 09:27 |只看该作者
如下代码在执行完free之后,内存会交还给系统,也就是说used在free()之后会减少很多;
如果把#if 1 改成 #i ...
bigcren 发表于 2010-08-26 09:08



    你怎么知道没有退还给系统?

论坛徽章:
0
3 [报告]
发表于 2010-08-26 09:37 |只看该作者
额,你改成#if 0 ,那端代码就没有编译 --!

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
4 [报告]
发表于 2010-08-26 09:47 |只看该作者
额,你改成#if 0 ,那端代码就没有编译 --!
davelv 发表于 2010-08-26 09:37


你再看看

论坛徽章:
0
5 [报告]
发表于 2010-08-26 10:28 |只看该作者
本帖最后由 davelv 于 2010-08-26 10:39 编辑
你再看看
egmkang 发表于 2010-08-26 09:47

OMG,看错了。。

测试了下,在我的系统上两者情况基本一致,没有出现楼主说的情况。

论坛徽章:
0
6 [报告]
发表于 2010-08-26 10:59 |只看该作者
楼主想过什么叫内存碎片没?你这种就是。你还可以将size定为1个字节,更碎

论坛徽章:
0
7 [报告]
发表于 2010-08-26 11:36 |只看该作者
回复 2# pengjianbokobe
我用free查看的,因为申请的比较多,此时也没有别的大量使用内存的程序,如果归还了,那么内存种used的抖动会很大。

论坛徽章:
0
8 [报告]
发表于 2010-08-26 11:36 |只看该作者
回复 6# blackuhlan
那也就是说这些内存碎片是回收不回去的么?

论坛徽章:
0
9 [报告]
发表于 2010-08-26 11:47 |只看该作者
OMG,看错了。。

测试了下,在我的系统上两者情况基本一致,没有出现楼主说的情况。
davelv 发表于 2010-08-26 10:28


#if 1 的结果
bigcren:~/work/mysrc/mem-size$ free
                       total       used       free     shared    buffers     cached
Mem:       4110484    1916924    2193560          0     206880     532960
-/+ buffers/cache:    1177084    2933400
Swap:     19543036     144012   19399024
bigcren:~/work/mysrc/mem-size$ ./malloc_free
okkkkkkkkkkkkkkkkk

在另一个shell里面运行free
bigcren:~/work/mysrc/mylist$ free
                       total       used       free     shared    buffers     cached
Mem:       4110484    1904352    2206132          0     202816     523928
-/+ buffers/cache:    1177608    2932876
Swap:     19543036     144012   19399024


#if 0 的结果
bigcren:~/work/mysrc/mem-size$ free
                      total       used       free     shared    buffers     cached
Mem:       4110484    1885744    2224740          0     202932     507692
-/+ buffers/cache:    1175120    2935364
Swap:     19543036     144008   19399028
bigcren:~/work/mysrc/mem-size$ ./malloc_free
okkkkkkkkkkkkkkkkk

在另一个shell里面运行free
bigcren:~/work/mysrc/mylist$ free
                      total       used       free     shared    buffers     cached
Mem:       4110484    3968664     141820          0     192884     477524
-/+ buffers/cache:    3298256     812228
Swap:     19543036     143948   19399088

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
10 [报告]
发表于 2010-08-26 16:09 |只看该作者
free是用户空间概念.free完毕即认为归还给系统了.
而free完的后能用不能用完全是你守不守规则的问题.你使用不属于你的东西也是可以的,但是是非法的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP