malloc und dazugehöriges free bei execvp



  • Hallo,

    eigentlich sollte es ja zu jedem malloc ein dazugehöriges free geben.
    Mach ich aber folgendes:

    char **array = malloc(3*sizeof(char*));
          array[0] = malloc(10);
          array[1] = malloc(10);
          array[0] = "echo";
          array[1] = "test";
          array[2] = (char *) NULL;
          execvp(array[0],array);
    

    Dann kann ich da ja nirgends das array wieder freigeben.
    Was mache ich dann in diesem Fall?

    Vielen Dank!



  • coder21 schrieb:

    eigentlich sollte es ja zu jedem malloc ein dazugehöriges free geben.

    Das ist eine Ausnahme der Regel. Am Schluss räumt das Betriebssystem auf (zumindest auf Betriebssystemen, die execvp bereitstellen kannst du davon ausgehen).

    coder21 schrieb:

    char **array = malloc(3*sizeof(char*));
    array[0] = malloc(10);
    array[1] = malloc(10);
    array[0] = "echo"; // setzt den Pointer von malloc(10) auf einen statischen const char*
    array[1] = "test"; // ein free darauf würde das Programm zu crashen bringen
    array[2] = (char *) NULL;
    

    Das ist dann aber total falsch. Sollte auf modernen Compilern nicht einmal mehr kompilieren.

    Du vermutlich eher willst ist

    execlp("echo","echo","test",NULL);
    

    Da hast du dann auch kein Memory-Leak.



  • Danke.

    Compiliert hatte es ;).
    Ist es dann so richtig?

    strcpy(array[0],"echo");
    


  • ...


  • Mod

    argsdgas schrieb:

    Sollte auf modernen Compilern nicht einmal mehr kompilieren.

    Stringliterale sind in C nicht const (der Versuch, sie zu modifizieren, führt trotzdem zu UB).



  • Empfiehlt es sich dann, nach dem execvp noch den Speicher freizugeben, falls execvp fehlschlagen sollte? Also so:

    char **array = malloc(3*sizeof(char*));
          array[0] = malloc(10);
          array[1] = malloc(10);
          strcpy(array[0],"echo");
          strcpy(array[1],"test");
          array[2] = (char *) NULL;
          execvp(array[0],array);
    
          free(array[0]);
          free(array[1]);
          free(array[2]);
          free(array);
    


  • Es ist immer sauberer, angeforderten dynamischen Speicher selbst freizugeben, als sich darauf zu verlassen, dass nichts weiteres kommt und mit Beendigung des Programms der Speicher ohnehin aufgeräumt wird.
    Stell dir vor, du in einigen Jahren oder wer anders möchte den Code erweitern und der nun ungebrauchte Speicher wurde nicht freigegeben.


Log in to reply