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

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

有帮助吗?

解决方案

不。

这不是内存泄漏。 exec*() 将在ARGS数组中制作字符串数据的本地副本,然后吹走子进程内存映像,并用它使用的内存图像覆盖它 /bin/echo. 。从本质上讲,Exec()之后剩下的就是PID。

编辑:

User318904提出了exec()返回-1(即失败)的情况。在这种情况下,已经分叉但未能执行的儿童进程确实有内存泄漏,但是正如对失败的EXEC的通常响应一样,无论如何都只是退出子进程,因此,OS将收回内存。尽管如此,释放它可能还是一个很好的习惯,如果没有其他原因,它会让您稍后再想知道它。

其他提示

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

分配的记忆应释放 exec. 。通话完成后,您无论如何都无法访问它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top