2016-03-01 31 views
6

qual è il modo giusto per liberare una memoria allocata dopo l'esecuzione della funzione in C (tramite malloc)? Ho bisogno di allocare memoria, usarla in qualche modo e restituirla, che devo liberarla.Come "free" variabile dopo la fine della funzione?

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

'char * str = someFunction (a, b) ; useitsomehow (str); free (str); ' –

+0

Bene, questo significa che restituirò il puntatore, che è disponibile per liberare come" str "perché ora è esattamente lo stesso puntatore? – JaxCze

+3

@JaxCze: Sì, anche io non lo chiamerei "esattamente lo stesso puntatore". È una variabile (puntatore) diversa con esattamente lo stesso valore, cioè che punta allo stesso oggetto. –

risposta

5

Utilizzare free. Nel tuo caso, sarà:

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

Inoltre, se si sta tornando la memoria allocata, come strdup fa, il chiamante della funzione deve liberare la memoria. Come:

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

Se stai pensando di liberandola dopo il ritorno di esso, ciò non è possibile. Dopo aver eseguito il comando return dalla funzione, viene automaticamente terminato.

+3

Questo frammento di codice sembra così abbozzato, spero che non ci siano equivoci: dovresti ** NON ** liberare la memoria prima di restituirla! – Marco13

3

Se si restituisce la memoria allocata, è responsabilità del chiamante liberarla.

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

Nel codice che ha chiamato someFunction.

Hai anche a mettere in chiaro nella documentazione (avete, vero ?!), che il chiamante deve chiamare free, dopo aver terminato di utilizzare il valore di ritorno.

3

Bene si return alla funzione di chiamata, quindi solo free il puntatore nella funzione di chiamata.

3

Se vuoi dire che il valore restituito non è necessaria in funzione chiamante e la funzione è chiamata a causa dei suoi effetti collaterali, allora si può solo scrivere

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

Non intendevo questo, ma questo suggerimento sarà utile per me :) grazie – JaxCze

Problemi correlati