2009-08-24 14 views
3

Ich habe mich gerade gefragt, in dem folgenden Szenario, ist der Speicher von 'Stringvar' verwendet freigegeben nach Methode1 ausgeführt wird?Erlischt der damit verbundene Speicher den freigegebenen Speicher?

// Just some method 
void method2(char* str) 
{ 
    // Allocate 10 characters for str 
    str = malloc(10 * sizeof(char)); 
} 

// Just another method 
void method1() 
{ 
    char* stringvar; 
    method2(stringvar); 

    // Is the memory freed hereafter, or do I need to call free()? 
} 

frage ich, denn wenn ich eine put ‚frei (stringvar)‘ am Ende des method1, ich habe eine Warnung erhalten, dass stringvar innerhalb method1 ist unitialized (was stimmt).

Antwort

22

Nein, der Speicher ist nicht freigegeben, nachdem method1, so dass Sie einen Speicherverlust haben werden. Ja, Sie müssen free aufrufen, nachdem Sie den Speicher nicht mehr benötigen.

Sie benötigen einen Zeiger auf einen Zeiger-method2 zu senden, wenn Sie es Speicher zuweisen wollen. Dies ist ein gängiges Idiom in der C-Programmierung, insbesondere wenn der Rückgabewert einer Funktion für ganzzahlige Statuscodes reserviert ist. Zum Beispiel

void method2(char **str) { 
    *str = (char *)malloc(10); 
} 

char *stringvar; 
method2(&stringvar); 
free(stringvar); 
+2

Vielen Dank für den Hinweis auf den ziemlich ernsten Fehler in Methode2. – emk

+1

Sie sollten den Rückgabewert von malloc nicht werfen, da dies C ist. – aib

+0

Wenn ich das "str" ​​in Methode2 als ein Array adressieren möchte, müsste ich * str [x] verwenden, richtig? – pbean

0

Nein, Sie müssen kostenlos() darauf selbst anrufen. Versuchen Sie, char * stringvar = 0; um die Warnung zu unterdrücken.

2

ist nicht nur stringvar uninitialized innerhalb method1, aber für ihn in method2 Zuweisen von Speicher, wie Sie tun, ist fehlerhaft. Sie ändern die Kopie des Zeigers in Methode2, aber das betrifft nicht die Kopie des Zeigers in Methode1. Sie müssen einen Doppelzeiger verwenden, damit stringvar in Methode1 auf den von Methode2 zugewiesenen Speicher zeigt.

5

Nein, dynamisch zugewiesener Speicher wird nicht automatisch für Sie freigegeben. In C ist es die Verantwortung des Programmierers zu befreien.

Auch - C übergibt Variablen nach Werten, str = malloc (10 * sizeof (char)); Ordnet nur die lokale Variable 'str' zu.

Scheint, wie Sie den Zeiger von malloc erhalten zurückkehren wollen würde, so dass Ihr Programm wird:

char *method2(void) 
{ 
    // Allocate 10 characters for str 
    return malloc(10 * sizeof(char)); 
} 

// Just another method 
void method1() 
{ 
    char* stringvar; 
    stringvar = method2(); 
    ... 
    free(stringvar); 
} 

Die andere Option, wenn Sie ‚stringvar‘ manipulieren wollen aus method2 einen Zeiger passieren ist zu 'stringvar', z

void method2(char** str) 
{ 
    // Allocate 10 characters for str 
    *str = malloc(10 * sizeof(char)); 
} 

// Just another method 
void method1() 
{ 
    char* stringvar; 
    method2(&stringvar); 
    ... 
    free(stringvar); 
} 
+1

Vergessen Sie nicht, die Anrufe zu geben, um frei zu geben() – plinth

+1

Für was es wert ist, ist 'sizeof (char)' garantiert 1 zu sein, so dass Sie nicht multiplizieren müssen. Ich bezweifle, dass es wichtig ist, aber ich denke, es sieht ein bisschen sauberer ohne aus. –