这会被视为内存泄漏吗?

时间:2010-09-20 22:54:20

标签: c memory-leaks malloc fork execv

考虑这个毫无意义的计划:

/* 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时它是否会被释放?

3 个答案:

答案 0 :(得分:10)

这不是内存泄漏。 exec*()将在args数组中创建字符串数据的本地副本,然后将子进程内存映像吹掉并用/bin/echo使用的内存映像覆盖它。基本上在exec()之后剩下的就是pid。

编辑:

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

答案 1 :(得分:3)

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

答案 2 :(得分:0)

分配的内存应由exec释放。通话结束后,无论如何都无法访问它。