LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: asert

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

[复制链接]
 楼主| 发表于 2007-3-3 23:27:25 | 显示全部楼层
  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. int main (void) {
  4.         char *ptr = malloc(10);
  5.         if(fork() == 0) {
  6.                 free(ptr);
  7.         }
  8.         free(ptr);       
  9.         return 0;
  10. }
复制代码
大家运行一下上面的程序看看,我这里运行报错:
*** glibc detected *** double free or corruption (fasttop): 0x0804a008 ***
回复 支持 反对

使用道具 举报

发表于 2007-3-3 23:52:38 | 显示全部楼层
应该写成这样

  1. #include <stdlib.h>
  2. #include <unistd.h>

  3. int main (void) {
  4.         char *ptr = malloc(10);
  5.         if(fork() == 0) {
  6.                 free(ptr);
  7.                 [color="Orange"]return 0;[/color]
  8.         }
  9.         free(ptr);       
  10.         return 0;
  11. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-4 01:04:49 | 显示全部楼层
Post by DoDo
应该写成这样
  1. #include <stdlib.h>
  2. #include <unistd.h>
  3. int main (void) {
  4.         char *ptr = malloc(10);
  5.         if(fork() == 0) {
  6.                 free(ptr);
  7.                 [color="Orange"]return 0;[/color]
  8.         }
  9.         free(ptr);       
  10.         return 0;
  11. }
复制代码
好厉害!能告诉我为什么吗?我写的和你写的有什么区别?
回复 支持 反对

使用道具 举报

发表于 2007-3-4 11:06:37 | 显示全部楼层
按照楼上的写法,if () 中的 free 只有子进程会运行,但是 if () 外面的那个两个进程都会执行到,并在子进程中导致了重复释放错误。

子进程要在恰当的地方退出,这是要非常注意的
回复 支持 反对

使用道具 举报

发表于 2007-3-4 16:45:02 | 显示全部楼层
DoDo说的很好,谢谢提醒!
我觉得像以下这样写会更好一些:

#include <stdlib.h>
#include <unistd.h>

int main (void)
{
    char *ptr = malloc(10);
    if(fork() == 0) {
        free(ptr);
    }
    else{
        free(ptr);
    }
    return 0;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-3-4 17:01:16 | 显示全部楼层
Post by DoDo
按照楼上的写法,if () 中的 free 只有子进程会运行,但是 if () 外面的那个两个进程都会执行到,并在子进程中导致了重复释放错误。

子进程要在恰当的地方退出,这是要非常注意的

汗!以前都没有注意这一点
马上要检查检查以前写的程序了
回复 支持 反对

使用道具 举报

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

本版积分规则

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