2017-07-27 1 views
1

Was passiert im folgenden Code mit dem Speicher, auf den myArray anfänglich gezeigt hat, nachdem er in der zweiten Zeile neu zugewiesen wurde? Ist dieser Speicher verloren, oder kümmert sich der C# -Abfallsammler darum?Was passiert mit dem Speicher, wenn Array in C# neu zugewiesen wird?

static void Main(string[] args) 
{ 
    double[] myArray = new Double[10]; 
    myArray = new Double[3]; 
} 

Soweit ich gelesen habe, gibt es keine Möglichkeit, um explizit den Speicher frei, so dass ich bin die Hoffnung, C# tut es automatisch.

+5

_Garbage Collector kümmert sich darum_ – Fabio

+0

Die Daten bleiben noch eine Weile im Speicher. Da Sie keinen Zeiger mehr auf diese Daten haben, wird GC diesen Speicherplatz bei Bedarf sammeln. – 0xaryan

Antwort

2

Wenn Ihre Variable den Gültigkeitsbereich verlässt und der Speicher nicht mehr benötigt wird, wird sie zur Garbage Collection berechtigt.

MS erklärt alle, wie hier zu sehen: https://msdn.microsoft.com/en-us/library/aa691138(v=vs.71).aspx

C# automatische Speicherverwaltung beschäftigt, die von Objekten belegt Entwickler von manuell zugeordnet und freigegeben den Speicher freigibt.

Automatische Speicherverwaltungsrichtlinien werden von einem Müll Kollektor implementiert. Der Speichermanagementlebenszyklus eines Objektes ist wie folgt :

  1. Wenn das Objekt erstellt wird, Speicher zugeordnet ist, wird der Konstruktor ausgeführt, und das Objekt wird Live betrachtet.
  2. Wenn auf das Objekt oder auf einen Teil davon nicht durch eine mögliche Fortsetzung der Ausführung abgesehen von der Ausführung von Destruktoren zugegriffen werden kann, wird das Objekt als nicht mehr verwendet betrachtet und kann für die Zerstörung verwendet werden. Der C# -Compiler und der Garbage Collector können wählen, Code zu analysieren, um zu bestimmen, welche Verweise auf ein Objekt in der Zukunft verwendet werden können. Zum Beispiel, wenn eine lokale Variable, die in Geltungsbereich ist die einzige vorhandene Verweis auf ein Objekt ist, aber diese lokale Variable ist nie in einer möglichen Fortsetzung der Ausführung von der aktuellen Ausführung Punkt in der Prozedur, die Garbage Collector kann (ist aber nicht) das Objekt als länger im Gebrauch behandeln.
  3. Sobald das Objekt für die Zerstörung geeignet ist, wird der Destruktor (Abschnitt 10.12) (falls vorhanden) für das Objekt zu einem späteren Zeitpunkt ausgeführt. Sofern durch explizite Aufrufe nicht überschrieben, wird der Destruktor für das Objekt nur einmal ausgeführt.
  4. Sobald der Destruktor für ein Objekt ausgeführt wird, kann auf das Objekt nicht zugegriffen werden, wenn auf dieses Objekt oder auf einen Teil davon durch eine mögliche Fortsetzung der Ausführung einschließlich der Ausführung von Destruktoren nicht zugegriffen werden kann für Sammlung.
  5. Schließlich, zu einem Zeitpunkt, nachdem das Objekt für die Sammlung in Frage kommt, gibt der Garbage Collector den Speicher frei, der mit diesem Objekt verknüpft ist.

Wenn Sie mehr ins Detail gehen wollen, dann können Sie hier sehen: https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/index

oder ich bin sicher, dass Sie auch einige Blogs zum Thema finden.

3

Natürlich gibt C# automatisch Speicher frei, der vor der Zuweisung mit myArray verknüpft war. Dies geschieht nicht sofort, aber sobald der Garbage Collector feststellt, dass keine weiteren Verweise auf das Array-Objekt * vorhanden sind, wird der dem Objekt zugewiesene Speicher zurückgewonnen.

Wenn Sie Ihr Programm ändern leicht einen zweiten Verweis auf das gleiche Array zu erstellen, wie dieses

double[] myArray = new Double[10]; 
double[] myArray2 = myArray; // Second reference 
myArray = new Double[3]; 

Garbage Collector würde nicht das Objekt freigeben, solange ein Verweis darauf zugänglich bleibt zu Ihrem Programm.

* Manchmal beendet Ihr Programm die Ausführung, bevor der Garbage Collector seine Analyse abgeschlossen hat. Der Speicher wird jedoch immer noch freigegeben.

+0

_ sobald der Garbage Collector feststellt, dass keine Referenzen mehr vorhanden sind _ .- abhängig von der Anwendungsgröße/die Verwendung kann nach dem Schließen der Anwendung erfolgen – Fabio

+0

@Fabio Das ist fair. Ich habe eine Fußnote hinzugefügt, um dies zu erwähnen. Vielen Dank! – dasblinkenlight

Verwandte Themen