2010-09-20 4 views
4

Tenir compte de ce programme inutile:Serait-ce considéré comme une fuite de mémoire?

/* 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-libérant ptr constituent une fuite de mémoire soit pour main.c ou l'autre programme, ou est-ce qu'il va être libéré de toute façon quand execve est appelé?

+0

Je dormirais mieux avec 'free (ptr);' avant le execve – pmg

Répondre

10

n °

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

Edit:

User318904 élevé le cas de exec() retournant -1 (à savoir, l'échec). Dans ce cas, le processus enfant qui a forké mais échoué à exec a, en effet, techniquement une fuite de mémoire, mais comme la réponse habituelle à un exec raté est de simplement quitter le processus enfant de toute façon, la mémoire sera récupérée par le système d'exploitation. Pourtant, la libérer est probablement une bonne habitude à prendre, si pour aucune autre raison que cela, il vous empêchera de s'interroger à ce sujet plus tard.

+0

Merci. Ce n'est pas un problème de ma part d'être trop paresseux pour ajouter gratuitement (ptr). Dans le cas réel, un peu plus compliqué que j'ai dans mon vrai programme, je passe une chaîne mallocée à exécuter, donc je suis incapable de le libérer (bien que j'appelle free si execve échoue). – Nick

+0

@Nick: La source de la mémoire (pile, tas, statique) est sans importance pour le système d'exploitation - tout est mémoire, et elle sera remplacée et récupérée automatiquement et sans effort par le système d'exploitation. –

0

La mémoire allouée doit être libérée par exec. Une fois l'appel terminé, vous ne pouvez plus y accéder.

3

Lorsque execve renvoie -1, oui. Sinon, peut-être.