2009-08-26 6 views
10

Sehr verwandt mit my previous question, aber ich fand dies ein separates Problem und bin nicht in der Lage, eine solide Antwort darauf zu finden.Wird der Speicher eines (Zeichen) -Arrays freigegeben, wenn der Gültigkeitsbereich überschritten wird?

Wird der Speicher, der von einem (Zeichen-) Array verwendet wird, freigegeben, wenn der Gültigkeitsbereich überschritten wird?

Ein Beispiel:

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

So nach dem method1 Aufruf ist der Speicher von str (10 Byte) verwendet befreit, oder muss ich ausdrücklich auch auf diese kostenlos anrufen?

Meine Intuition sagt mir, dies ist nur ein einfaches Array von primitiven Typen, so dass es automatisch befreit wird. Ich bin im Zweifel, weil man in C nicht davon ausgehen kann, dass irgendetwas automatisch freigegeben wird.

Antwort

18

In diesem Fall müssen Sie nicht kostenlos anrufen. Der Wert "str" ​​ist ein stackbasierter Wert, der bereinigt wird, wenn diese bestimmte Methode/der bestimmte Bereich verlassen wird.

Sie müssen nur Werte frei aufrufen, die explizit über malloc erzeugt werden.

+1

(wobei "nein" bedeutet - ja, es ist kostenlos, indem Sie außerhalb des Geltungsbereichs gehen, und nein, Sie müssen nicht explizit kostenlos anrufen) – jmanning2k

+0

@ jmanning2k ich las meine Post auch neu und edited es zu sein ein bisschen klarer darüber, was "nein" bedeutete – JaredPar

1

Nein, lokale Variablen dieser Art werden auf dem Stack zugeordnet. Wenn Sie also von der Prozedur zurückkehren, steht der Speicher für den nächsten Funktionsaufruf zur Verfügung, der den Speicher für seinen Stack-Frame verwendet.

Wenn Sie malloc()10 verwenden, wird der Speicherplatz auf dem Heap reserviert, der explizit freigegeben werden muss.

9

Es wird automatisch freigegeben. Wenn Sie es nicht malloc, müssen Sie es nicht freigeben. Aber das hat nichts damit zu tun, ein "einfaches Array von primitiven Typen" - es wäre frei, wenn es ein Array von Strukturen wäre. Es wird freigegeben, da es sich um eine lokale Variable handelt.

Da Sie diese sehr grundlegenden Fragen stellen, muss ich fragen, welches C-Lehrbuch Sie verwenden. Persönlich glaube ich nicht, dass Sie nützlich lernen können C ohne lesen Kernighan & Ritchie The C Programming Language, die erklärt all diese Sachen sehr deutlich.

+0

Ausgezeichneter Rat! – Lazarus

+0

Ich habe die Programmiersprache C von K & R gelesen (und studiert), aber das war schon einige Zeit her und bevor ich mich selbst ein bisschen mehr "in" gebracht habe. – pbean

0

Ich denke, es ist befreit, nicht weil es Primitiven ist, sondern dass es eine lokale Variable ist und die auf dem Stapel nicht den Heap zugeordnet wird. Wenn Sie es nicht malloc, dann können Sie es nicht freigeben, soweit ich mich erinnere.

0

Ja, es ist "befreit", wenn es außerhalb des Geltungsbereichs geht.
Nein, Sie müssen es nicht explizit freigeben.

Das char-Array wird auf dem Stack zugewiesen. Wenn Sie also von der Funktion zurückkehren, ist dieser Stack-Speicherplatz wiederverwendbar. Sie müssen den Speicher nicht explizit freigeben.

Gute Faustregel: Wenn Sie malloc, müssen Sie free.

+0

Die Frage ist über C, nicht C++ –

+0

Ah, ja, tatsächlich. Lass mich das reparieren. –

3

Ja, es ist "befreit." (Not free() 'ed, though.)

Da str ist eine automatische Variable, wird es nur so lange wie sein Umfang, der bis zum Ende des Funktionsblocks ist.

Beachten Sie, dass Sie nur frei() was Sie malloc().

2

Ja, der Speicher wird automatisch freigegeben, sobald method1 zurückgibt. Der Speicher für str ist auf dem Stapel zugeordnet und wird freigegeben, sobald der Stack-Frame der Methode bereinigt ist. Vergleichen Sie dies mit dem Speicher, der auf dem Heap zugeordnet ist (über malloc), den Sie explizit freigeben müssen.

0

Ich bin ein bisschen rostig in C/C++ in letzter Zeit, aber ich denke, du hast Recht. Solange Sie diesen Speicher nicht dynamisch zugewiesen haben, sollten Sie in Ordnung sein.

Verwandte Themen