2010-05-03 11 views
5

Lets sagen, ich habe so etwas wie ...Statisches C++ - Array, das zu Speicherlecks führt?

void foo() 
{ 
    char c[100]; 
    printf("this function does nothing useful"); 
} 

Wenn foo genannt wird, schafft es das Array auf dem Stapel, und wenn es geht aus dem Umfang, ist der Speicher automatisch freigegeben? Oder ist c zerstört, aber der Speicher bleibt zugewiesen, ohne Zugriff auf ihn/es zurück zu bekommen, außer den Computer neu zu starten?

+0

Dies ist kein statisches Array. Es ist nur ein lokales (Stapel-zugeordnetes) Array. –

Antwort

6

wird der Speicher automatisch freigegeben?

Ja. Und die Destruktoren werden auch gerufen, falls Sie sich fragen. Deshalb sind sie in der automatic storage class.

(Eigentlich für die meisten Architekturen wird das Programm nur rufen, dass 100 Destruktoren (falls vorhanden), dann rückwärts, um den Stapelzeiger verschieben um 100 * sizeof(T) Bytes als „Freigabe“.)

+0

Ok. Danke für alle, die geantwortet haben. Ich war mir sicher, new/delete zu verwenden, aber jemand hatte mir den Eindruck vermittelt, dass das, was ich gepostet hatte, nicht freigegeben würde. Wie kommen Sie in eine Situation, in der ein Zeiger gelöscht wird (wenn er den Gültigkeitsbereich verlässt), aber die Daten, auf die er zeigt, bleiben zugewiesen (auch nicht zugreifbar)? – MDonovin

+0

@MDonovin: Siehe mmrs Antwort http://stackoverflow.com/questions/2758970/c-static-array-leading-to-memory-leak/2758985#2758985. – kennytm

0

Es ist weg - alles weg.

Der Speicher ist jedoch sofort für die nächste Funktion verfügbar. Der Stapel wird nur als Zeiger implementiert. Wenn Sie c [100] ausführen, wird der Zeiger 100 Byte nach unten bewegt, sodass der nächste angeforderte Speicher nach c kommt. Wenn Sie die Funktion verlassen, bewegt sich der Stapelzeiger einfach zurück zur vorherigen Position, bevor Sie die Funktion aufgerufen haben. Dies ist eine sehr schnelle und effiziente Möglichkeit, Speicher im Vergleich zu neuen/löschen/malloc zu verwalten

4

In diesem Fall, ja, der Speicher ist freigegeben. Wenn Sie etwas getan haben wie:

Dann würde das bleiben, sobald die Funktion beendet ist.

Jedoch! Sie müssen nicht neu starten, um den Speicher auf einem modernen Betriebssystem zu verlieren. Stattdessen wird der Speicher zurückgegeben, sobald der Prozess (Programm) beendet ist.

3

Um klar zu sein, gibt es hier nicht wirklich eine Speicherzuweisung; Es gibt eine Stapelzuordnung statt. Der Unterschied ist signifikant, da der erstere einen Funktionsaufruf erfordert, Speicher aus dem Zuordnungssystem reserviert und eine Menge Overhead benötigt. Im Gegensatz dazu beinhaltet letzteres nur das Erhöhen des Stapelzeigers. Stapelzuordnungen sind immer viel, viel schneller und werden, außer in Fällen von Fehlern, die Stapelkorruption betreffen, immer bereinigt, wenn Ihre Funktion beendet wird.

Verwandte Themen