Dynamische Speicherverwaltung für char **
-
Hallo,
ich arbeite gerade an einem Programm mit dynamischer Speicherverwaltung bei dem ich Zeichenketten, die main per *argv[] übergeben werden, in einen neuen Zeichenkettenvektor kopiere und bin mir nicht sicher, ob ich den Speicher korrekt freigebe.
Teile des Codes:
... void deleteText(char **text, int nrWords) { // gibt den Speicherplatz für die Wörter des Textes wieder frei int i; for (i=0; i<nrWords; i++) { free(text[i]); } } ... int main (int argc, char *argv[]) { char **text = NULL; //Zeichenketten-Vektor //Speicher für Zeichenketten-Vektor reservieren //Array mit argc-1 Elementen text = (char**)malloc((argc-1) * sizeof(char*)); if (text == NULL) { fprintf(stderr, "Fehler bei argc malloc\n"); exit(1); } //Länge für einzelnen Elemente for (i=0; i<(argc-1); i++) { text[i] = (char*)malloc((strlen(argv[i+1])+1) * sizeof(char)); if (text[i] == NULL) { fprintf(stderr, "Fehler bei argv malloc\n"); exit(2); } } //Argv in Vektor kopieren for (i=0; i<(argc-1); i++) { strcpy(text[i], argv[i+1]); } ... //Speicher für einzelnen Wörter freigeben deleteText(text, argc-1); //Speicher für Char Pointer Array freigeben free(text); }
Programm an sich funktioniert perfekt. Bin mir nur nicht sicher ob ich am Ende mit
//Speicher für einzelnen Wörter freigeben deleteText(text, argc-1); //Speicher für Char Pointer Array freigeben free(text);
korrekt den kompletten reservierten Speicher wieder freigebe.
Für eine Antwort danke ich im voraus.
Gruß Thomas
-
Für solche Sachen benutze valgrind (gibt es allerdings nur für Unix).
L. G.
Steffo
-
Ich glaube, Du gibst in deleteText einen Pointer zu wenig wieder frei. Du rufst es schon mit argc - 1 auf, und gehst dann praktisch nur bis nrWords - 1, was argc - 1 - 1 entspricht.
Edit:
Nee, nach näherer Betrachtung glaube ich, es hat alles seine Richtigkeit.
-
Für solche Sachen benutze valgrind (gibt es allerdings nur für Unix).
L. G.
SteffoDanke für den Tipp, ich programmiere zwar gerade unter Windows, werde mir valgrind aber bei Gelegenheit mal in meiner virtuellen Maschine anschauen.
Ich glaube, Du gibst in deleteText einen Pointer zu wenig wieder frei. Du rufst es schon mit argc - 1 auf, und gehst dann praktisch nur bis nrWords - 1, was argc - 1 - 1 entspricht.
Edit:
Nee, nach näherer Betrachtung glaube ich, es hat alles seine Richtigkeit.Dann bin ich beruhigt. Habe eben auch nochmal versucht den Code nachzuvollziehen und bin mit dem -1 und < etwas durcheinander gekommen. Aber da ich ja auch nur für argc-1 Speicher reserviere und das Array bei 0 anfängt sollte argc-2 hoffentlich korrekt sein.
Naja eigentlich ging es mir auch nur drum, ob das doppelte Speicher freigeben einmal für die einzelnen text[i] und dann für text richtig ist. Ich arbeite zum ersten Mal dynamischer Speicherverwaltung und habe hier direkt ein Array mit Pointern auf Strings variabler Länge, was mich etwas verwirrt hat. Aber da du das nicht bemängelt hast, scheine ich dabei wohl alles richtig gemacht zu haben.
Danke für die Hilfe
Gruß Thomas
-
Generell liegst Du richtig, wenn Du alles, das separat reserviert wurde auch separat freigibst. Insofern schön "Dimension" für Dimension abknabbern