4

考虑这个毫无意义的程序:

/* main.c */

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

int main(int argc, char **argv) {
    int i;
    for (i = 0; i < 1024; i++) {
        int pid = fork();
        int status;
        if (pid) {
            wait(&status);
        }
        else {
            char *ptr = (char *)malloc(1024*sizeof(char));
            char *args[2] = {"Hello, world!", NULL};
            execve("/bin/echo", args, NULL);
        }
    }
}

释放不会ptr对 main.c 或其他程序构成内存泄漏,还是在调用 execve 时它会被释放?

4

3 回答 3

10

不。

这不是内存泄漏。 exec*()将在 args 数组中制作字符串数据的本地副本,然后吹走子进程内存映像并将其与/bin/echo. 基本上,在 exec() 之后剩下的就是 pid。

编辑:

User318904 提出了 exec() 返回 -1(即失败)的情况。在这种情况下,分叉但执行失败的子进程确实在技术上确实存在内存泄漏,但是由于对失败的执行的通常响应是无论如何都退出子进程,内存将被操作系统回收。尽管如此,释放它可能是一个养成的好习惯,如果没有其他原因,它会让你以后不再想它。

于 2010-09-20T23:00:41.000 回答
3

当 execve 返回 -1 时,是的。否则,也许。

于 2010-09-20T23:04:04.993 回答
0

分配的内存应该被释放exec。通话完成后,您无论如何都无法访问它。

于 2010-09-20T23:00:12.250 回答