Wie gebe ich Speicher im Zusammenhang mit der Funktion getline() richtig frei?

Lesezeit: 2 Minuten

Benutzer-Avatar
woshidashen

Ich habe gerade mit dem Programmieren angefangen und habe eine Anfängerfrage, ich möchte eine Funktion schreiben, um eine Datei mit unbekannter Länge Zeile für Zeile zu lesen. Da ich die Länge jeder Zeile nicht kennen würde, habe ich sie verwendet getline() Funktion:

void readDict(FILE *dict_file){
  //Read dic 
  char *line;
  size_t len = 0, read;
  while((read = getline(&line, &len, dict_file))!=-1){
    check(line); 
  }
  free(line);
  return;
}

Seit getline() ist irgendwie ähnlich malloc() und realloc() eine Zeichenfolge, also wenn ich diese Funktion weiterhin verwende, um viele Zeilen mit unbekannter Länge zu lesen, bekomme ich dann ein Speicherleck oder keinen Speicher mehr?

  • Basierend auf Dokumentationdu musst malloc Speicher für line Vor Berufung getline.

    – bejado

    27. Februar 2017 um 6:10 Uhr


  • @bejado Nein, es ist kein Muss.

    – Sourav Ghosh

    27. Februar 2017 um 6:10 Uhr

  • @SouravGhosh wie würden Sie es tun, ohne Speicher zuzuweisen?

    – bejado

    27. Februar 2017 um 6:12 Uhr

  • @bejado “Wenn *lineptr NULL ist, weist getline() einen Puffer zum Speichern der Zeile zu, der vom Benutzerprogramm freigegeben werden sollte.”

    – Sourav Ghosh

    27. Februar 2017 um 6:14 Uhr

  • @SouravGhosh wusste das nicht, danke!

    – bejado

    27. Februar 2017 um 6:15 Uhr

Benutzer-Avatar
Sourav Ghosh

Zunächst sollten Sie initialisieren lineptr zu NULL. Ohne eine ordnungsgemäße Initialisierung lineptr enthält unbestimmten Wert, der macht lineptr um auf einen ungültigen Speicherort zu zeigen, und später im Prozess wird es aufgerufen undefiniertes Verhalten beim Versuch zuzuordnen (realloc()) angemessene Menge an Speicher.

Dann, gemäß der Manpage,

[…] vor dem Anruf getline(), *lineptr kann einen Zeiger auf a enthalten malloc()-zugewiesener Puffer *n Byte groß. Wenn der Puffer nicht groß genug ist, um die Zeile zu halten, getline() ändert die Größe mit realloc()Aktualisierung *lineptr und *n wie nötig.

Also, solange Sie das gleiche passieren *lineptrSie sollten in Ordnung sein, wenn Sie free() nur einmal am Ende.

  • Wenn ich also den Zeiger initialisiere, sollte er {char *line=NULL;} sein?

    – Woshidashen

    27. Februar 2017 um 6:30 Uhr

  • @GhostKidYao Ja.

    – Sourav Ghosh

    27. Februar 2017 um 6:30 Uhr

  • Okay, danke für deine Antwort!

    – Woshidashen

    27. Februar 2017 um 6:31 Uhr

1119160cookie-checkWie gebe ich Speicher im Zusammenhang mit der Funktion getline() richtig frei?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy