Будет ли это считаться утечкой памяти? - PullRequest
4 голосов
/ 21 сентября 2010

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

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

10 голосов
/ 21 сентября 2010

номер

Это не утечка памяти. exec*() сделает локальную копию строковых данных в массиве args, затем сдует образ памяти дочернего процесса и наложит его на образ памяти, используемый /bin/echo. По сути, все, что остается после exec () - это pid.

Edit:

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

3 голосов
/ 21 сентября 2010

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

0 голосов
/ 21 сентября 2010

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

...