2016-03-01 7 views
6

Was ist der richtige Weg, um einen zugewiesenen Speicher nach der Ausführung der Funktion in C (über malloc) freizugeben? Ich muss Speicher zuweisen, irgendwie verwenden und zurückgeben, als ich es freigeben muss.Wie "frei" Variable nach Ende der Funktion?

char* someFunction(char* a, char* b) { 
    char* result = (char*)malloc(la + 2 * sizeof(char)); 
    ... 
    return result; 
} 
+9

'char * str = Funktion (a, b) ; benutztsomehow (str); free (str); ' –

+0

Nun, das bedeutet, dass ich den Zeiger zurückgeben werde, der frei ist als" str ", weil es jetzt genau der gleiche Zeiger ist? – JaxCze

+3

@JaxCze: Ja, ich würde es auch nicht "genau den gleichen Zeiger" nennen. Es ist eine andere (Zeiger-) Variable mit genau demselben Wert, d. H. Zeigt auf dasselbe Objekt. –

Antwort

5

Verwendung free. In Ihrem Fall wird es sein:

char* result = malloc(la + 2 * sizeof(char)); 
... 
free (result); 

Auch wenn Sie reservierten Speicher zurückkehrt, wie strdup der Fall ist, hat der Anrufer Ihrer Funktion den Speicher freizugeben. Wie:

result = somefunction(); 
... 
free (result); 

Wenn Sie denken, befreien sie, nachdem er zurückkehrt, ist das nicht möglich. Sobald Sie return etwas von der Funktion haben, wird es automatisch beendet.

+3

Dieses Code-Snippet sieht so aus skizzenhaft, ich hoffe, es gibt keine Missverständnisse: Du solltest ** NICHT ** die Erinnerung "befreien", bevor du sie zurückbringst! – Marco13

3

Wenn Sie zugewiesenen Speicher zurückgeben, ist es die Verantwortung des Aufrufers, sie freizugeben.

char *res; 
res = someFunction("something 1", "something 2"); 
free(res); 
6

In dem Code, den someFunction genannt.

Sie müssen auch klar in der Dokumentation machen (Sie haben das, richtig ?!), dass der Anrufer free zu nennen hat, nach dem Rückgabewert beendet werden.

3

Nun, Sie return es auf aufrufende Funktion, dann nur free der Zeiger in aufrufende Funktion.

3

Wenn Sie, dass der Rückgabewert bedeutet nicht in der aufrufenden Funktion und die Funktion aufgerufen wird aufgrund seiner Nebenwirkungen Sie können dann benötigt wird, schreiben Sie einfach

free(someFunction(p, q)); 
+0

Ich meinte das nicht so, aber dieser Tipp wird für mich nützlich sein :) danke – JaxCze