2009-08-26 9 views
10

Molto simile a my previous question, ma ho trovato che questo è un problema separato e non riesco a trovare una risposta solida a questo.La memoria di un array (di caratteri) viene liberata andando fuori campo?

La memoria utilizzata da un array (di caratteri) viene liberata dall'esclusione dall'ambito?

Un esempio:

void method1() 
{ 
    char str[10]; 
    // manipulate str 
} 

Così, dopo la chiamata method1, è la memoria utilizzata da str (10 byte) liberato, o ho bisogno di chiamare esplicitamente gratuito su questo pure?

La mia intuizione mi dice che questa è solo una semplice serie di tipi primitivi, quindi viene automaticamente liberata. Sono in dubbio perché in C non puoi assumere nulla per essere automaticamente liberato.

risposta

18

In questo caso no non è necessario chiamare gratuitamente. Il valore "str" ​​è un valore basato sullo stack che verrà ripulito quando si esce da quel particolare metodo/ambito.

È sufficiente chiamare gratuitamente sui valori creati in modo esplicito tramite malloc.

+1

(dove "no" significa - sì, è liberato andando fuori dal campo di applicazione, e no non è necessario chiamare gratuitamente in modo esplicito) – jmanning2k

+0

@ jmanning2k rileggo anche il mio post e lo ho editato un po 'più chiaro su cosa significa "no" – JaredPar

1

No, le variabili locali di questo tipo sono allocate nello stack, quindi quando si ritorna dalla procedura la memoria è disponibile per la prossima chiamata di funzione, che utilizzerà la memoria per il suo stack frame.

Se si utilizza malloc(), lo spazio viene allocato sull'heap, che deve essere liberato in modo esplicito.

9

Viene automaticamente liberato. Se non lo hai mallocato, non hai bisogno di liberarlo con lo . Ma questo non ha nulla a che fare con il fatto che sia una "semplice schiera di tipi primitivi" - sarebbe liberato se fosse un array di strutture. È liberato perché è una variabile locale.

Dato che stai facendo queste domande molto semplici, Devo chiedere quale libro di testo C stai usando. Personalmente, non credo che si possa utilmente imparare C senza leggendo Kernighan & Ritchie's The C Programming Language, che spiega tutte queste cose molto chiaramente.

+0

Consiglio eccellente! – Lazarus

+0

In realtà ho letto (e studiato) il linguaggio di programmazione in C di K & R, ma è stato qualche tempo fa e prima ancora mi sono "coccolato" un po 'di più. – pbean

0

Penso che sia liberato non perché è primitivo ma che è una variabile locale e che sarà allocata sullo stack non sull'heap. Se non lo fai, non puoi liberarlo da quel che ricordo.

0

Sì, è "liberato" quando esce dal campo di applicazione.
No, non è necessario liberarlo esplicitamente.

Il char array è allocato nello stack, quindi quando si ritorna dalla funzione, lo stack è riutilizzabile. Non è necessario liberare esplicitamente la memoria.

Buona regola empirica: se si malloc, è necessario free.

+0

La domanda riguarda C, non C++ –

+0

Ah, sì, davvero. Lascia che ti aggiusti. –

3

Sì, è "liberato". (Non libero(), tuttavia,.)

Poiché str è una variabile automatica, durerà solo il suo ambito, che è fino alla fine del blocco funzione.

Si noti che è solo gratuito() ciò che si usa malloc().

2

Sì, la memoria viene liberata automaticamente una volta restituiti method1. La memoria per str viene allocata nello stack e viene liberata una volta ripulito lo stack frame del metodo. Confrontalo con la memoria allocata nell'heap (tramite malloc) che devi esplicitamente liberare.

0

Ultimamente sono un po 'arrugginito in C/C++, ma penso che tu abbia ragione. Finché non hai allocato dinamicamente quella memoria, dovresti stare bene.

Problemi correlati