Re: Richtige Zerstörung von eigenen Objekten

Tech-Archive recommends: Fix windows errors by optimizing your registry

From: Peter Fleischer (peter.fleischer_nospam__at_gmx.de)
Date: 08/02/04


Date: Mon, 2 Aug 2004 12:06:21 +0200

Stefan Leiber wrote:
...
> Also das heisst dann, wenn ich es richtig verstanden habe,
> das ich direkt keine Speicher freigeben kann.

Stefan,
was nutzt es dir, Speicher freizugeben? Das System ist da garantiert
optimaler organisiert, als dass du das in deiner Einzelanwendung
organisieren kannst, da du auf die Ressourcennutzung der anderen Prozesse
keinen Einfluss hat. Das System incl. GC entscheidet, wann es den Speicher
verdichten muss. Du kannst es nur bedingt für deine eigenen Prozesse
unterstützen.

> Bei C++ ist
> mir dies doch direkt möglich,

Was soll dieser Vergleich? In anderen System und Programmiersprachen gibt es
noch andere Techniken.

> hier wird diese Arbeit von
> dem Garbage Collector übernommen der in gewissen
> Zeitabständen die Klasseninstanzen prüft und dann gegebenen
> falls freigbt.
>
> Wenn ich jetzt aber in meiner Klasse eine
> Finalize-Methode() habe und diese nach der Verwendung des
> Objektes aufrufe, wird diese in der Garbage Collection
> vermekrt (Mit einem sogenannten HEAP?)

Die Finalize-Methode ist nicht für dich vorgesehen, sondern sollte dem GC
vorbehalten bleiben.

> und führt dazu das
> das der Speicher dieser Instanz schneller freigegeben wird,
> beeinträchtig aber wiederum die Leistung des Programmes.

Wenn auf deiner Festplatte 2 GB freier Platz sind, dein Programm 1 GB belegt
hatte und du viel CPU-Zeit benötigst, warum soll dann der GC arbeiten? Lass
doch das System entscheiden, wann es optimal ist. Eine schnellere Freigabe
bedeutet doch eine zusätzliche CPU-Belastung, die dein Programm ggf.
ausbremst.

> Wie müsste dann der Aufbau der Klasse sein, damit die
> Finalize-Methode aufgerufen und durchgefuehrt werden kann.

Prüfe in der Finalize-Methode, ob Dispose schon aufgerufen wurde und rufe
Dispose auf, falls es noch nicht aufgerufen wurde. Im Dispose rufst du vor
der Vernichtung der in der Klasse erzeugten weiteren Instanzen deren
Dispose-Methóden auf. Nach dem Aufruf von Dispose für die eingebettenen
Objekte vernichtest du alle Bezüge auf diese Objekte in dieser Klasse.

Diesen ganzen Aufwand kannst du dir aber sparen, wenn keine "unmamaned"
Ressourcen genutzt werden und keine allzu tiefe Verschachtelung der
Instanzierung vorliegt.

> In einem meiner Bücher "ASP.NET Developer´s Guide" steht
> drin, das es dafür schon Destruktoren zu Verfügung stehen,
> nämlich "Destruct". Kann ich diese dafür verwenden ? Oder
> ist dies wieder was ganz anderes und hat mit dieser Sache
> nichts am Hut :).
>
> Und was mir leider auch noch nicht ganz klar ist der
> Unterschied zw. Finalize und Dispose.

Das sind 2 verschiedene Methoden: Finalize gibt es immer, da vom
System.Object geerbt, Dispose kannst du selbst hinzufügen bei Bedarf.

> ich hoffe die jetzt nicht mit Fragen zu überschlagen, würde
> nur gerne das Grundprinzip der Objektzerstörung besser
> verstehen um zu wissen wie ich dies korrekt einsetze

Was hast zu meinem vorherigen Posting oder zu den umfangreichen Ausführungen
in der Hilfe denn nicht verstanden?

Peter



Relevant Pages

  • Re: Richtige Zerstörung von eigenen Objekten
    ... Ich wollte mit dem Posting nur erreichen, ... >> Wie müsste dann der Aufbau der Klasse sein, ... >Prüfe in der Finalize-Methode, ob Dispose schon aufgerufen ... >Dispose auf, falls es noch nicht aufgerufen wurde. ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: EInvalidPointer bei dispose Befehl.
    ... An unhandled exeception occurred at $0805BA62: EInvalidPointer: ... Ich reserviere in einer Procedure per "new;" Speicher. ... Und immer wenn ich Dispose aufrufe bekomme ich den Fehler ... Filebuff ist global definiert. ...
    (de.comp.lang.pascal)
  • Re: Richtige Zerstörung von eigenen Objekten
    ... > ich programmiere gerade meine eigene Klassen. ... Prinzipiell kannst du selbst explizit keinen Speicher freigeben. ... Der GC prüft bei Bedarf jede Klasseninstanz, ... Klasse besitzt eine Finalize-Methode, ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: "Destructor"?
    ... Werden Objekte mit einer finalize-Methode denn "sofort" von der Garbage Collection bearbeitet, sobald sie nicht mehr referenziert werden? ... kann auch gleich der Speicher freigegeben werden. ... Reference Counting funktioniert leider mit zyklischen Strukturen nicht ohne manuellen Eingriff; Java hatte immer schon etwas kompliziertere GC-Strategien, die allerdings alle *irgendwann* ablaufen. ...
    (de.comp.lang.java)
  • RE: Probleme beim Freigeben von Speicher - Implementieren von Dispose
    ... Aufruf von Dispose und manuelles Anstossen ... nur ein Panel, das auf der Form liegt, das Formular selber bleibt ... von mir programmierten UserControls aufgerufen werden. ... der Speicher nicht frei gegeben. ...
    (microsoft.public.de.german.entwickler.dotnet.framework)