Вопрос

Рассмотрим эту бессмысленную программу:

/* 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.

Редактировать:

Пользователь 318904 рассказал о случае, когда exec() возвращает -1 (т. е. сбой).В этом случае дочерний процесс, который разветвился, но не смог выполниться, действительно технически имеет утечку памяти, но поскольку обычной реакцией на неудачное выполнение является выход из дочернего процесса в любом случае, память будет возвращена ОС.Тем не менее, освобождение от этого, вероятно, является хорошей привычкой, хотя бы по той причине, что она убережет вас от размышлений об этом позже.

Другие советы

Когда Execve возвращает -1, да. В противном случае, может быть,.

Выделенная память должна быть освобождена exec. Отказ После завершения вызова вы не можете получить доступ к ней все равно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top