LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1633|回复: 15

关于内存分配和fork()的问题

[复制链接]
发表于 2007-2-20 14:17:26 | 显示全部楼层 |阅读模式
fork产生的子进程会复制父进程的空间,在父进程中分配的内存是否也许要在
子进程中释放掉呢?

一个例子:
void main(){
void *ptr = malloc(10);
if(fork() == 0){ {
/* 请问这里是否也需要free(ptr)?*/
}
free(ptr);
}
发表于 2007-2-20 18:15:21 | 显示全部楼层
My answer is yes.
大家认为哪?
回复 支持 反对

使用道具 举报

发表于 2007-2-22 22:42:01 | 显示全部楼层
我觉得也要。
回复 支持 反对

使用道具 举报

发表于 2007-2-22 23:17:40 | 显示全部楼层
是的,好像是控制实例存在的变量消减为0才会释放,子进程中那个控制变量fork时自动加1了。
回复 支持 反对

使用道具 举报

发表于 2007-2-23 00:39:56 | 显示全部楼层
Post by huyongzs
是的,好像是控制实例存在的变量消减为0才会释放,子进程中那个控制变量fork时自动加1了。

你说得不对.
libc能检测到当前有多少指针引用指向同一个内存块吗?如果这样的话那就根本可以像java那样只要检测到一个内存块没有被任何指针指向就自动释放掉,还用这么麻烦程序员手动释放吗?
回复 支持 反对

使用道具 举报

发表于 2007-2-23 13:02:35 | 显示全部楼层
Post by cccer
你说得不对.
libc能检测到当前有多少指针引用指向同一个内存块吗?如果这样的话那就根本可以像java那样只要检测到一个内存块没有被任何指针指向就自动释放掉,还用这么麻烦程序员手动释放吗?
是fork的时候那个管理实例的变量加一,程序每fork一次产生的子进程继承一次父进程打开的实例。父子进程单方面都不能关闭一个实例。所以,这个实例(比如说文件描述符代表的实例)需要同时对子进程和父进程都有效。
父子进程都用free来释放是需要将fork时候加1的变量值减1.当减到0的时候,系统就会释放这个实例,这也是手动释放,释放的原因是手动free,但是最终导致实例释放的是操作系统
。他等待接受到足够多free才会释放。
回复 支持 反对

使用道具 举报

发表于 2007-2-23 17:37:57 | 显示全部楼层
fork创建新的进程,新的进程有自己的内存空间(地址空间),fork之后新的进程也要对malloc过的内存进行free,这个与楼上几位说的管理实例方式是不一样的,没有什么计数不计数。这就好像一个妈妈和她小孩一样,各自长各自的指甲,妈妈的指甲长了需要剪掉,小孩的指甲长了也需要剪掉,但是剪掉妈妈的指甲小孩的指甲是不会自动消失的,还是需要小孩自己去剪。呵呵,有点不伦不类的比喻。
回复 支持 反对

使用道具 举报

发表于 2007-2-23 20:37:15 | 显示全部楼层
fork时是把父进程的地址空间复制给子进程,那如果static变量遗传给子进程,那么malloc的数据也会遗传给子进程。 这是fork的性质决定的。这就是C语言的内存管理的复杂,如果直观的一个malloc一个free释放,那么lisp,java的内存自动管理就不会那么有名了。
回复 支持 反对

使用道具 举报

发表于 2007-2-23 20:41:54 | 显示全部楼层
Post by wsw
fork时是把父进程的地址空间复制给子进程,那如果static变量遗传给子进程,那么malloc的数据也会遗传给子进程。 这是fork的性质决定的。这就是C语言的内存管理的复杂,如果直观的一个malloc一个free释放,那么lisp,java的内存自动管理就不会那么有名了。

这个和c语言没有任何关系,只是和操作系统有关系而已!c语言本身并没有进程之类的概念。
回复 支持 反对

使用道具 举报

发表于 2007-2-24 14:11:57 | 显示全部楼层
重新学习!学习。。。。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表