Question

Considérez ce programme inutile:

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

ne serait pas libérer ptr constituent une fuite de mémoire soit pour main.c ou l'autre programme, ou est-il va être libéré de toute façon quand execve est appelé?

Était-ce utile?

La solution

Non.

Ce n'est pas une fuite de mémoire. exec*() fera une copie locale des données de chaîne dans le tableau args, puis souffler l'image mémoire du processus de l'enfant et la superposition avec l'image de mémoire utilisée par /bin/echo. Essentiellement, tout ce qui reste après l'exec () est le pid.

Edit:

User318904 élevé le cas de exec () retournant -1 (à savoir, l'échec). Dans ce cas, le processus de l'enfant qui a fourchue, mais pas exec ne, en effet ont techniquement une fuite de mémoire, mais comme la réponse habituelle à un exec échoué est de sortir tout le processus de l'enfant de toute façon, la mémoire sera récupérée par le système d'exploitation. Pourtant, libérant est probablement une bonne habitude à prendre, si pour aucune autre raison que cela va vous empêcher de se demander à ce sujet plus tard.

Autres conseils

Au retour execve -1, oui. Dans le cas contraire, peut-être.

La mémoire allouée doit être libéré par exec. Une fois l'appel terminé, vous ne pouvez pas accéder à toute façon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top