free真的释放内存了吗?

不要天真的想程序中用了free之后,你的程序就会把内存还给了操作系统。从事C编程的人应该要知道,我们所用

的malloc和free是由glibc提供的。glibc是一个具有系统级感觉的用户级程序,负责管理内存堆区。所以到底把free的

内存还给还是没还给操作系统,大家还是看malloc和free的源码比较好。
现在就交大家测试一下malloc和free的方法。

01 #include <stdlib.h>
02 #include <stdio.h>
03
04 char * ch [ 1000 ];
05
06 int main( intargc , char * argv [])
07 {
08
09     inti , j;
10
11     int size = atoi( argv [ 1 ]);
12
13     for( i = 0; i < 1000; ++ i)
14         ch [ i ] = ( char *) malloc( size);    //申请内存
15
16     for( i = 0; i < 1000; ++ i)              //换入内存,如不进行操作,glibc并不会真正的向系统申请内存
17         for( j = 0; j < size; ++ j)          //这样做是为了去掉glibc对内存管理的优化操作
18             ch [ i ][ j ] = 'a';
19
20     getchar();                         //IO中断,为了给查看进程内存提供时间
21
22     for( i = 0; i < 1000; ++ i)              //释放内存
23         free( ch [ i ]);
24
25     while( 1);                          //为了给查看进程内存提供时间
26
27     return0;
28
29 }

终端1:
gcc test.c
./a.out 32768
之后不要敲击任何键

终端2:
ps v -C a.out
我测试的时候,内存利用率大概为8%

之后,在终端1上敲击一下回车,程序会调用free释放内存。

在终端2上重新键入ps v -C a.out,会发现内存利用率并没有下降还是8%(看到了吧,free之后是什么样子,并没有

变)。

当我们把32768换成65536再试试,你就会发现不一样的情况。看样子glibc在释放的时候是做了阈值限制的,大于

64K的内存块才是被真正的释放。当然这只是glibc其中的冰山一角。具体那些小一些的块是如何处理的,大家就自

己研究吧。

转载于:https://www.cnblogs.com/haolujun/archive/2011/06/13/2079559.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值