Die Zerstörung eines struct-Objekt in C#?
Ich bin ein wenig verwirrt über die Tatsache, dass in C# nur die Referenz-Typen bekommen Müll gesammelt.
Das bedeutet, dass GC picks nur die Referenz-Typen für Speicher de-Allokation.
Was passiert also mit den Wert-Typen, wie Sie auch die occupy-Speicher auf dem stack ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für einen start, egal, ob Sie auf dem Stapel oder ein Teil des Heaps, hängt davon ab, welchem Zusammenhang, Sie sind Teil von - wenn Sie innerhalb eines Referenz-Typ haben, werden Sie auf dem heap jedenfalls. (Sollten Sie überlegen, wie viel Sie wirklich über die stack - /heap-teilen sowieso - wie Eric Lippert hat geschrieben, es ist weitgehend eine Implementierung detail.)
Jedoch grundsätzlich Wert-Typ memory wird zurückgefordert, wenn der Kontext zurückgefordert - also, wenn der stack geholt, durch die Sie der Rückkehr aus einer Methode, die "reaktiviert" wird der gesamte stack-frame. Ebenso, wenn der Werttyp Wert ist tatsächlich Teil eines Objekts, der Speicher ist dann zurückgefordert werden, wenn das Objekt von der garbage Collection eingesammelt.
Die kurze Antwort ist, dass Sie nicht haben, um sorgen machen 🙂 (Dies setzt Voraus, Sie haben nichts anderen als den Speicher zu kümmern, natürlich - wenn Sie haben Strukturen mit Referenzen auf native-Griffe, die müssen loslassen, das ist ein etwas anderes Szenario.)
Dies ist nicht eine Tatsache. Oder vielmehr, die Wahrheit oder Falschheit dieser Aussage hängt davon ab, was du damit meinst "bekommen garbage Collection". Der garbage collector sieht sicherlich an Wert-Typen, wenn Sie sammeln; diese Wert-Typen sein könnte, lebendig und hielt sich an einem Referenz-Typ:
wenn der garbage collector läuft, es sieht in s, weil es braucht, um zu bestimmen, dass s.str ist noch am Leben.
Mein Vorschlag: klären genau was du meinst mit dem verb "wird Müll gesammelt".
Wieder, dies ist nicht eine Tatsache. Angenommen, Sie haben eine Instanz von
den Speicher für die Ganzzahl wird auf die garbage Collection-heap, und daher zurückgefordert werden durch den garbage collector, wenn die Instanz von C wird unbewurzelten.
Warum glauben Sie, dass die Lüge, dass nur die Speicher-Referenz-Typen aufgehoben wird, indem der garbage collector? Die richtige Aussage ist, dass Speicher, der zugeordnet durch den garbage collector ist freigegeben durch den garbage collector, die ich denke, macht auch Sinn. Der GC zugeordnet werden, damit er ist verantwortlich für die Reinigung it up.
Gar nichts passiert. Nichts muss passieren. Der stack ist eine million bytes. Die Größe des stack wird bestimmt, wenn der thread gestartet, es beginnt bei einer million bytes, und es bleibt eine million bytes, die während der gesamten Ausführung des Threads. Speicher auf dem stack wird weder erzeugt, noch vernichtet werden, nur die Inhalte geändert werden.
Gibt es auch viele Verben, die in dieser Frage, wie Sie zerstört, zurückgefordert, aufgehoben, entfernt. Nicht gut entsprechen, was tatsächlich passiert. Eine lokale variable, die einfach erledigt werden, Norwegische parrot Stil.
Einer Methode hat einen single point of entry, das erste, was passiert ist, dass die CPU-stack-pointer angepasst. Erstellung eines "stack-frame", der Speicherplatz für die lokalen Variablen. Die CLR garantiert, dass dieser Speicherplatz wird initialisiert auf 0, sonst nicht eine Funktion, die Sie verwenden, stark in C#, da die eindeutige Zuordnung Regel.
Einer Methode hat einen einzigen Punkt zu beenden, auch wenn Sie Methode code ist gespickt mit mehreren
return
Aussagen. An diesem Punkt, der stack-pointer ist einfach wieder auf den ursprünglichen Wert. In der Wirkung, es "vergisst", dass die lokalen Variablen, wo immer es. Ihre Werte sind nicht "geschrubbt" in keiner Weise die bytes sind immer noch da. Aber Sie wird nicht lange dauern, wird der nächste Aufruf in Ihr Programm gehen, um überschreiben Sie Sie wieder ein. Die CLR null-Initialisierung Regel sorgt dafür, dass Sie noch nie beobachten die alten Werte, das wäre unsicher.Sehr, sehr schnell, dauert nicht mehr als einem einzelnen Prozessor-Zyklus. Eine sichtbare Nebenwirkung dieses Verhaltens in die Sprache C# ist, dass die Wert-Typen können nicht finalizer. Die Gewährleistung keine extra-arbeiten zu erledigen.
Den Wert Typ auf dem stack wird vom stack entfernt, wenn es den Bereich verlässt.
Wert Arten werden zerstört, sobald Sie nicht mehr gültig sind.
Wert-Typen bekommen würde freigegeben, wenn der stack-frame wird entfernt, nachdem es ausgeführt wurde, würde ich davon ausgehen
Möchte auch hinzufügen, dass der Stapel wird in eine thread Ebene und heap ist bei der Anwendung der domain-Ebene.
So, wenn ein thread beendet, es würde reclam die stack-Speicher verwendet, die von diesem bestimmten thread.
Jeden Wert eine Art Instanz in .NET wird Teil von etwas anderem sein, was könnte eine größere einschließenden Wert-Typ Instanz, ein heap-Objekt, oder ein stack-frame. Wenn alle diese Dinge kommen ins sein, alle Strukturen, in Ihnen wird auch zustande; diese Strukturen werden dann solange bestehen bleiben, als die Sache mit Ihnen macht. Wenn die Sache, die enthält die Struktur aufhört zu existieren, wird die Struktur als gut. Es gibt keine Möglichkeit zu zerstören, eine Struktur zu zerstören, ohne die container, und es gibt keine Möglichkeit, etwas zerstören, die enthält eine oder mehrere Strukturen ohne Zerstörung der Strukturen, die darin enthalten ist.