免费注册 查看新帖 |

Chinaunix

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

关于malloc的问题~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-31 22:27 |只看该作者 |倒序浏览

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5.         int i;
  6.         int *pi_tmp;
  7.         for(i=0;i<10000;i++)
  8.         {
  9.                 pi_tmp=(int *)malloc(10*1024*1024*sizeof(int));
  10.                 fprintf(stderr,"After malloc pi_tmp===%Xn",pi_tmp);
  11.                 sleep(1);
  12.         }
  13. }
复制代码

上面这段代码每一次在堆中分配4*10*1024*1024bytes不释放,我觉得程序所占用的内存会快速增长,但是我用top查看,这个进程并没有占用很多内存,最多的时候才占1M多,大家知道这是为什么吗?我是用root用户执行的,ulimit -a结果如下
core file size               (blocks, -c) 0
data seg size              (kbytes, -d) unlimited
file size                        (blocks, -f) unlimited
max locked memory     (kbytes, -l) unlimited
max memory size       (kbytes, -m) unlimited
open files                    (-n) 1024
pipe size                   (512 bytes, -p) 8
stack size                (kbytes, -s) 10240
cpu time                    (seconds, -t) unlimited
max user processes            (-u) 4080
virtual memory          (kbytes, -v) unlimited

应该是操作系统没有限制程序所使用堆的大小吧,程序的执行结果最后就变成了
After malloc pi_tmp===9896008
After malloc pi_tmp===5847008
After malloc pi_tmp===3046008
After malloc pi_tmp===F70F6008
After malloc pi_tmp===F98F7008
After malloc pi_tmp===FC0F8008
After malloc pi_tmp===0
After malloc pi_tmp===0
After malloc pi_tmp===0
After malloc pi_tmp===0
应该是分配失败了,能不能帮我解释一下这个现象呢~~谢谢了~~

论坛徽章:
0
2 [报告]
发表于 2005-10-31 22:31 |只看该作者
延迟分配,只有你在进行内存写入操作时,才实际分配内存。

论坛徽章:
0
3 [报告]
发表于 2005-10-31 22:44 |只看该作者
我试试看~~

论坛徽章:
0
4 [报告]
发表于 2005-10-31 22:47 |只看该作者
果然是~~谢谢renstone921了~~我加了一句
memset(pi_tmp,1,(10*1024*1024*sizeof(int)));
结果top中这个进程占用的内存飞速增长,很快就死机了~~

论坛徽章:
0
5 [报告]
发表于 2005-10-31 22:56 |只看该作者
准确地说,调用malloc时分配的是地址空间,只是告诉操作系统,某个地址空间被占用了,只有进行写入操作时,才进行物理内存的分配。

论坛徽章:
0
6 [报告]
发表于 2005-10-31 22:59 |只看该作者
这是内核内存管理的特性是吗

论坛徽章:
0
7 [报告]
发表于 2005-10-31 23:04 |只看该作者
应当算是一种优化策略吧。

论坛徽章:
0
8 [报告]
发表于 2005-11-01 10:05 |只看该作者
再问一个弱弱的问题~~上面我分配了(10*1024*1024*sizeof(int))的内存区,但是如果使用

  1. free(pi_tmp);
复制代码

可不可以把申请的(10*1024*1024*sizeof(int))大的内存区全部释放,我觉得因为指针都是有类型的比如
int *pt_tmp
那么pt_tmp是整形指针,在32位机中一般都是指向4个字节,在free的时候os肯定知道pt_tmp指向的头4个字节属于自己,会回收头4个字节,那除了这四个字节的其他部分呢~os会free掉吗~?谢谢了~~

论坛徽章:
0
9 [报告]
发表于 2005-11-01 10:15 |只看该作者
偶有一些关于这个的道听途说
malloc和free是libc里头的东东
malloc的时候会在你所分配的内存前面那一小块地方保存这次malloc的大小
后面的free要用到的

论坛徽章:
0
10 [报告]
发表于 2005-11-01 10:22 |只看该作者


  1. int *pi_tmp1,*pi_tmp2;
  2. pi_tmp1=(int *)malloc(1024);
  3. pi_tmp2=pi_tmp1;
  4. free(pi_tmp2);
复制代码

也是正确的吧~
下面的呢

  1. int *pi_tmp;
  2. char *pc_tmp;
  3. pi_tmp=(int *)malloc(1024);
  4. pc_tmp=(char *)pi_tmp;
  5. free(pc_tmp);
复制代码

是不是也可以正确的释放掉malloc的内存呢~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP