it-swarm.com.de

Richtige Methode zum Freigeben des Speichers einer zurückgegebenen Variablen

Ich habe eine Funktion erstellt, um Benutzereingaben zu erhalten. Der Speicher muss der Variablen zugewiesen werden, die die Benutzereingabe enthält. Diese Variable wird jedoch am Ende der Funktion zurückgegeben. Was ist die richtige Methode, um den zugewiesenen Speicher freizugeben/den Wert der Variablen zurückzugeben?

Hier ist der Code:

char *input = malloc(MAX_SIZE*sizeof(char*));
int i = 0;
char c;

while((c = getchar()) != '\n' && c != EOF) {
    input[i++] = c;
}

return input;

Soll ich die Adresse der Eingabe zurückgeben und sie nach der Verwendung freigeben?

Neugierig auf die geeignetste Methode zum Freigeben der Eingabevariable.

13
w m

Es ist ziemlich einfach, solange der gleiche Zeiger an free() übergeben wird, der von malloc() zurückgegeben wird, ist dies in Ordnung.

Zum Beispiel

char *readInput(size_t size)
 {
    char *input;
    int   chr;
    input = malloc(size + 1);
    if (input == NULL)
        return NULL;
    while ((i < size) && ((chr = getchar()) != '\n') && (chr != EOF))
        input[i++] = chr;
    input[size] = '\0'; /* nul terminate the array, so it can be a string */
    return input;
 }

 int main(void)
  {
     char *input;
     input = readInput(100);
     if (input == NULL)
         return -1;
     printf("input: %s\n", input);
     /* now you can free it */
     free(input);
     return 0;
  }

Was Sie niemals tun sollten, ist so etwas

free(input + n);

denn input + n ist nicht der Zeiger, der von malloc() zurückgegeben wird.

Aber Ihr Code hat andere Probleme, die Sie beachten sollten

  1. Sie weisen Speicherplatz für MAX_SIZEchars zu. Sie sollten also mit sizeof(char) multiplizieren, dh 1, anstelle von sizeof(char *), der MAX_SIZE-Zeiger zuweisen würde, und stattdessen MAX_SIZE einen Funktionsparameter definieren Array in main() mit der Größe MAX_SIZE wie char input[MAX_SIZE], und übergeben Sie es als Parameter an readInput(), wodurch malloc() und free() vermieden werden.

  2. Sie reservieren zwar so viel Speicherplatz, verhindern jedoch keinen Überlauf in Ihrer while-Schleife. Sie sollten diesen i < MAX_SIZE überprüfen.

15
Iharob Al Asimi

Sie könnten eine Funktion mit dem Rückgabetyp char* schreiben, input zurückgeben und den Benutzer auffordern, free aufzurufen, sobald er die Daten eingegeben hat.

Sie können den Benutzer auch auffordern, einen Puffer mit angemessener Größe zusammen mit einer Begrenzung der Puffergröße selbst zu übergeben und zurückzugeben, wie viele Zeichen in den Puffer geschrieben wurden.

4
orlp

Dies ist ein klassischer Fall. Eine Funktion mallocs Speicher für das Ergebnis, der Aufrufer muss den zurückgegebenen Wert freigeben. Sie gehen jetzt auf das dünne Eis der Gedächtnislecks. 2 Gründe

Zuerst ; Es gibt keine Möglichkeit für Sie, die freie Anforderung durchsetzbar zu kommunizieren (dh der Compiler oder die Laufzeitumgebung kann Ihnen nicht helfen - im Gegensatz zur Angabe der Argumenttypen). Sie müssen es nur irgendwo dokumentieren und hoffen, dass der Anrufer Ihre Dokumente gelesen hat

Zweitens: Selbst wenn der Anrufer weiß, dass er das Ergebnis freigeben möchte, macht er möglicherweise einen Fehler, wird ein Fehlerpfad genommen, der den Speicher nicht freigibt. Dies führt nicht zu einem sofortigen Fehler. Die Dinge scheinen zu funktionieren, aber nach 3 Wochen läuft Ihre App ab, nachdem der Speicher ausgeht

Aus diesem Grund konzentrieren sich so viele "moderne" Sprachen auf dieses Thema, intelligente Zeiger für C++, Java, C # usw., Garbage Collection, ...

1
pm100