Serait-ce considéré comme une fuite de mémoire?
-
04-10-2019 - |
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é?
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.