免费注册 查看新帖 |

Chinaunix

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

问个有深度的问题-子进程内存释放问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-03-11 13:27 |只看该作者 |倒序浏览
一个进程,它malloc了一块内存,然后开始
for(int i = 0;i < 5;i++){
    fork();
}

那么父里程已经malloc的内存,fork出子进程后,子进程需不需要free?
父子进程肯定是要的。。


这个问题有意思吧,呵呵。。。

论坛徽章:
0
2 [报告]
发表于 2010-03-11 13:35 |只看该作者
有意思

论坛徽章:
0
3 [报告]
发表于 2010-03-11 13:42 |只看该作者
当然 要 了

论坛徽章:
0
4 [报告]
发表于 2010-03-11 17:11 |只看该作者
思考了一下,认为需要

论坛徽章:
0
5 [报告]
发表于 2010-03-11 17:13 |只看该作者
网上找的,懒得写了

有人问我,在父进程中Malloc的内存空间,如果fork()后,到了子进程中,会不会在copy 一份出来?还是公用一个空间?看程序:
void main()
{
        char *p;
        p = malloc(10);
        strcpy(p, "ccc");
        printf("p=%p %s\n", p, p);
        if (fork() == 0)
        {
                strcpy(p, "ccc3333");
                printf("child p=%p %s\n", p,p);
                sleep(10);
                printf("child p=%p %s\n", p,p);
        }
        else
        {
                sleep(3);
                strcpy(p, "ccc444");
                printf("father p=%p %s\n", p,p);
        }
        free(p);
}

执行结果:
[zyx@ymserver src]$ ../bin/t1   
p=0x8ea0008 ccc
child p=0x8ea0008 ccc3333
father p=0x8ea0008 ccc444
[zyx@ymserver src]$ child p=0x8ea0008 ccc3333

最开始,内存块的值是ccc,地址为0x8ea0008
后来,先执行子进程的                strcpy(p, "ccc3333"); 发现,内存值变成了ccc3333
再父进程                strcpy(p, "ccc444"); 发现,内存值变成了ccc444
那么是不是子进程的值被改变了呢?不是,看最后,子进程读取的内存值还是ccc3333,就可以知道,父子进程各有一片空间。
那么为什么p的地址都是一个地方呢?那是因为这个地址是一个虚拟的地址,每个进程都拥有自己的虚拟地址空间,不同进程的相同地址空间其实在物理上是不同的地址块!

注:上面的程序没有加上错误判断,测试程序而已,不用加了。

论坛徽章:
0
6 [报告]
发表于 2010-03-11 17:21 |只看该作者
不同的空间,应该是要释放的
5楼测试程序不错

论坛徽章:
0
7 [报告]
发表于 2010-03-11 17:27 |只看该作者
太牛了,我佩服死这个问题了

论坛徽章:
0
8 [报告]
发表于 2010-03-11 20:54 |只看该作者
曾经也有类似的迷茫, 不过后来我知道有进程空间 逻辑地址这回事后,就不再迷茫了  

论坛徽章:
0
9 [报告]
发表于 2010-03-12 11:26 |只看该作者
rain_fish 谢了,原来要释放的,呵呵,我得改程序了。。。再一次谢谢,结贴。。。

论坛徽章:
0
10 [报告]
发表于 2010-03-13 15:53 |只看该作者
回复 5# rain_fish


    麻烦请教一下,fork()出来的子进程好像是采用的写时拷贝技术,那如果对fork()出来的指针只进行读操作,这个时候子进程还会对父进程的指针做一份拷贝吗?谢谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP