这会被视为内存泄漏吗?

发布于 2024-09-24 09:28:11 字数 565 浏览 9 评论 0原文

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

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

Consider this pointless program:

/* 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);
        }
    }
}

Would not freeing ptr constitute a memory leak for either main.c or the other program, or is it going to be freed anyway when execve is called?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

暮年慕年 2024-10-01 09:28:11

不。

这不是内存泄漏。 exec*() 将在 args 数组中制作字符串数据的本地副本,然后清除子进程内存映像并将其与 /bin/echo< 使用的内存映像覆盖。 /代码>。基本上 exec() 之后剩下的就是 pid。

编辑:

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

No.

This is not a memory leak. exec*() will make a local copy of the string data in the args array, then blow away the child process memory image and overlay it with the memory image used by /bin/echo. Essentially all that remains after the exec() is the pid.

Edit:

User318904 brought up the case of exec() returning -1 (i.e., failure). In this case, the child process that has forked but failed to exec does, indeed technically have a memory leak, but as the usual response to a failed exec is to just exit the child process anyways, the memory will be reclaimed by the OS. Still, freeing it is probably a good habit to get into, if for no other reason than that it will keep you from wondering about it later on.

梦明 2024-10-01 09:28:11

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

When execve returns -1, yes. Otherwise, maybe.

自此以后,行同陌路 2024-10-01 09:28:11

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

The allocated memory should be freed by exec. After the call completes you can't access it anyway.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文