Es wird nicht garantiert, dass Destruktoren aufgerufen werden

8

Ich stieß auf folgendes Zitat: "Destruktoren werden nicht garantiert aufgerufen." und das macht mir Angst.

Weiter heißt es, dass sogar ein try-finally-Block unterbrochen werden kann, was Speicherlecks verursacht. Es gibt eine Lösung, indem Sie entweder Ihren Code in CER (Constrained Execution Region) setzen oder von CriticalFinalizerObject ableiten.

Meine Frage ist

  1. Was sind die Tradoffs, wenn Sie CriticalFinalizerObject verwenden, falls vorhanden?
  2. Sind ihre Fälle, in denen Sie gefunden haben, dass CriticalFinalizerObject wirklich nützlich war?
  3. Soll ich mich nur darum kümmern, wenn ich in Speicherlecks stoße?
Jethro 14.07.2011, 11:43
quelle

4 Antworten

3

Warum verlassen Sie sich auf Destruktoren? die meiste Zeit brauchst du sie nicht.

Vielleicht werfen Sie einen Blick auf IDisposeable und das Entsorgungsmuster.

Hier einige Links, die mir helfen, dieses Thema zu verstehen

- & gt; Jeder denkt über die falsche Garbage Collection nach

- & gt; So implementieren Sie das Dispose-Muster

- & gt; Implementieren von "Abschließen und Löschen" zum Bereinigen nicht verwalteter Ressourcen

>     
Boas Enkler 14.07.2011, 11:48
quelle
1

Zu Frage Nr. 3: Speicherlecks würden normalerweise verursacht durch:

  • Nicht verwaltete Ressourcen werden nicht freigegeben. Für diese ist die Verwendung von IDisposable (mit einem Fallback-Aufruf an Dispose () im Finalizer) der beste Ansatz.

  • Verweise auf verwaltete Objekte, die verwaltet werden, weil andere Objekte immer noch auf sie verweisen, obwohl sie eigentlich entfernt werden sollen. IHMO, das ist eher ein Problem der Code-Qualität als ein Low-Level-Problem mit Garbage Collection.

Wenn Sie nicht in tatsächliche Speicherlecks geraten, sollten Sie sich nicht einmal darum kümmern und nicht versuchen, irgendein Verhalten zu erzwingen.

    
svanryckeghem 14.07.2011 12:17
quelle
0

Ich würde vorschlagen, die Schnittstelle IDisposable für alle Ressourcen zu verwenden, die zerstört werden müssen, und sie in einem using -Block zu verwenden.

    
Leonard Brünings 14.07.2011 11:48
quelle
0

Normalerweise werden die Unterschiede zwischen einem normalen Finalizer und einem kritischen Finalizer nur beim Entladen von AppDomain wichtig. Da die meisten nicht verwalteten Ressourcen automatisch beim Entladen des Prozesses verloren gehen, müssen Sie sich normalerweise nur um die kritische Finalisierung kümmern, wenn Sie AppDomain s sauber entladen möchten, während Sie den Prozess am Laufen halten.

    
CodesInChaos 14.07.2011 12:23
quelle

Tags und Links