smart_ptr sind Referenz gezählt. Während dies eine deterministische Freigabe ihrer Ressourcen ermöglicht, wenn sie von keinem Code mehr referenziert werden, haben sie ihre eigenen Probleme: das Zuweisen von Referenzen erfordert immer, dass der Zähler aktualisiert wird, zirkuläre Referenzen nicht automatisch freigegeben werden und Speicherlecks verursachen Der Speichermanager wird häufiger aufgerufen.
Die GC in .NET ist ein mitreißender Sammler. Es beginnt zu jeder Zeit, wenn es sich anfühlt, dass Speicher freigegeben werden sollte (normalerweise durch eine Speicherbenutzungsbedingung ausgelöst, aber nicht deterministisch) und beginnt mit dem Erstellen einer Liste aller Live-Referenzen im System (einschließlich denen in CPU-Registern, verschachtelten Referenzen, etc .). Dies funktioniert, da wir uns in einer verwalteten Umgebung befinden, in der Sie keine Zeigerarithmetik usw. ausführen können. Das System kann alle Referenzen verfolgen. Nachdem die Liste der Live-Referenzen erstellt wurde, werden im Prinzip alle Speicher freigegeben, die nicht mehr verwendet werden. Natürlich ist dies nur die Grundskizze, für die Effizienz und Verwaltung von nicht verwalteten Ressourcen gibt es mehr wie Objektgenerationen, Finalizer usw., aber das ist nicht wichtig für das grundlegende Verständnis dessen, wie es funktioniert.
Die IDisposable-Schnittstelle wird verwendet, um das Einweg-Muster zu implementieren, die hilft, wenn Sie mit Objekten arbeiten, die in einer deterministischen Art und Weise entsorgt werden. Das Muster ist so, dass Dispose() explizit aufgerufen wird, wenn das Objekt nicht mehr benötigt wird, also nicht verwaltete Ressourcen freigibt oder Griffe usw. schließt, aber seinen Speicher nicht freigibt. Dies wird später von der GC gemacht, aber es spielt keine Rolle, dass dies später passiert, weil die deterministische Freigabe von Ressourcen bereits durchgeführt wurde.
+1. Ich bin mir sicher, dass diese Frage bereits gestellt wurde :) –
Willst du damit sagen, dass ich nichts "wegschaffen" muss? –
Nur in dem Sinne, dass selbst dann, wenn Sie dies nicht tun, Ressourcen freigegeben werden (wenn sie IDisposable korrekt implementieren). In der Praxis ist dies lediglich ein Sicherheitsnetz. Sie möchten nicht verwaltete Ressourcen so schnell wie möglich freigeben. –