这是否被认为是内存泄漏?

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时会被自动释放?

在执行execve之前加上free(ptr);,我会感觉更安心。 - pmg
3个回答

10

编号

这不是内存泄漏。 exec*()会在args数组中创建字符串数据的本地副本,然后清除子进程的内存映像,并用/bin/echo 使用的内存映像覆盖它。实际上,在执行exec()之后仅剩下pid。

编辑:

User318904提到了exec()返回-1(即失败)的情况。 在这种情况下,分叉但未能执行的子进程确实具有内存泄漏问题,但由于对失败的exec的通常响应是退出子进程,因此内存将被操作系统回收。 但是,出于其他原因,释放它可能是一个好习惯,因为这样做可以避免以后对此产生疑虑。


谢谢。这不是我太懒而不想添加free(ptr)的问题。在我的实际程序中,情况略微复杂,我实际上是将一个malloc分配的字符串传递给execve,所以我无法释放它(但如果execve失败,我会调用free)。 - Nick
@Nick:内存的来源(栈、堆、静态)对操作系统来说并不重要——它只是内存,操作系统会自动而且无痛地替换和回收它。 - Drew Hall

3
当execve返回-1时,是的。否则,可能不是。

0

分配的内存应该由exec释放。调用完成后,您无法再访问它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接