2017-02-09 7 views
0

I Schleife die Ausführung der Funktion Foo mehrfach zu zerstören:C# Variablen Speicher freizugeben

int Foo(int a) 
{ 
int b = 5; 
return a * b; 
} 

Ich glaube, die Variable „b“ wird, wird oft initialisiert (so oft wie I Funktion Foo initialisieren) . Angenommen, ich möchte "b" nicht außerhalb der Funktion Foo verschieben, muss ich den Speicher freigeben, der von nachfolgenden "b" -Initialisierungen beansprucht wird, oder wird das automatisch gemacht?

+2

b wird auf dem Stapel erstellt. Sobald du zurückkehrst, geht es weg. –

+1

@MatthewWhited 'b' wird nicht * unbedingt * auf dem Stapel erstellt; https://blogs.msdn.microsoft.com/ericlippert/2009/04/27/the-stack-is-an-implementation-detail-part-one/ –

+2

Wenn Sie denken, dass Sie diese Art von Variablen _manage_ müssen empfehle Ihnen, [Value vs Reference Types] (http://www.albahari.com/valuevsreftypes.aspx) zu lesen und den Unterschied zwischen [heap and stack] zu verstehen (http://stackoverflow.com/questions/79923/what- und-wo-sind-der-Stapel-und-Heap) – Steve

Antwort

3

Das sind ganze Zahlen und könnten auf dem Stapel gespeichert werden, aber in diesem Fall nicht wahrscheinlich. Stack-Speicher muss nicht verwaltet werden, sobald die Variable nicht mehr im Gültigkeitsbereich ist, wird sie vom Stack entfernt und der Speicher wird freigegeben. Außerdem müssen Sie sich selten Gedanken darüber machen, wie Sie den Speicher in .net manuell verwalten, wenn Sie (ordnungsgemäß) verwaltete Objekte verwenden.

Weitere Informationen, wenn diese Werte tatsächlich auf dem Stack gespeichert sind oder nicht, finden Sie unter this answer by Marc Gravell. Auch, wie in dieser Antwort darauf hingewiesen, Eric Lippert a well written article auf diese (von 2009, aber nicht viel hat sich geändert).

von Marc GRA Antwort

Sie sind manchmal, aber nicht so:

  • Felder auf einer Klasse
  • erfassten Variablen
  • Variablen in einem Iteratorblock
+4

Werttypen gehen nicht unbedingt auf den Stapel. Sie werden dort gespeichert, wo die Daten für diese Variable gespeichert sind, und zwar an einer beliebigen Anzahl von Orten, von denen nur einer der Stapel ist. – Servy

+1

@Servy - Wahr, aber in dem eher einfachen Beispiel oben wäre das wahrscheinlich der Ort, wo sie sein würden. – Igor

+2

@Igor Es ist ziemlich wahrscheinlich, dass es * nicht * hier auf dem Stapel sein wird. Aber selbst wenn das wahr wäre, ist die Antwort immer noch falsch und irreführend. – Servy

Verwandte Themen