Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wann Destruktor-Aufruf nötig? (https://www.delphipraxis.net/79689-wann-destruktor-aufruf-noetig.html)

Cöster 26. Okt 2006 14:36


Wann Destruktor-Aufruf nötig?
 
Hi!

In welchen Fällen ist es eigentlich sinnvoll, den Destruktor aufzurufen? Wenn ich z.B. eine Instanz beim Programmstart per FInstanz := TKlasse.Create; erzeugt habe und den Konstruktor später nochmal aufrufen möchte, um alle Eigenschaften der Instanz zurückzusetzen, ist es dann nötig, vorher die alte Instanz zu destroyen?

Wann ist der Aufruf von FInstanz.Destroy überhaupt angebracht? Nur beim Programmende?

hoika 26. Okt 2006 14:41

Re: Wann Destruktor-Aufruf nötig?
 
Hallo,

1. schreibe eine Methode Clear, die du sowohl im constructor
als auch bei Bedarf aufrufen kannst.

2. rufe nie Destroy direkt auf, sondern nimm Free.

Mit Clear brauchst du erst am Programmende Free aufrufen.


Heiko

Hador 26. Okt 2006 14:53

Re: Wann Destruktor-Aufruf nötig?
 
Zitat:

Zitat von Cöster
In welchen Fällen ist es eigentlich sinnvoll, den Destruktor aufzurufen? Wenn ich z.B. eine Instanz beim Programmstart per FInstanz := TKlasse.Create; erzeugt habe und den Konstruktor später nochmal aufrufen möchte, um alle Eigenschaften der Instanz zurückzusetzen, ist es dann nötig, vorher die alte Instanz zu destroyen?

Wenn es nur darum geht, einige Eigenschaften auf einen Ausgangswert zurückzusetzen, kannst du dies natürlich auch tun ohne das jeweilige Objekt zu zerstören.

Zitat:

Zitat von Cöster
Wann ist der Aufruf von FInstanz.Destroy überhaupt angebracht? Nur beim Programmende?

Erzeuge ein Objekt sobald du es brauchst und zerstöre es, wenn du es nicht mehr brauchst.

Cöster 26. Okt 2006 17:32

Re: Wann Destruktor-Aufruf nötig?
 
Warum zerstört Delphi eigentlich nicht automatisch alles am Programmende?

Khabarakh 26. Okt 2006 18:08

Re: Wann Destruktor-Aufruf nötig?
 
Du stellst dir das etwas zu einfach vor, dafür bräuchte Delphi schon einen richtigen (naja, > 3/4) Garbage Collector. Und außer bei Klassen, die ein Handle auf externe Ressourcen halten, ist das Freigeben bei Programmende sowieso egal.

DGL-luke 26. Okt 2006 18:13

Re: Wann Destruktor-Aufruf nötig?
 
Jop, um Khabarakhs Äußerung ein wenig zu präzisieren, Windows markiert Speicher, den ein Programm gehalten hatte, wieder als frei, wenn das Programm beendet wird.

Cöster 26. Okt 2006 18:34

Re: Wann Destruktor-Aufruf nötig?
 
Dann sind Meinungen wie "jede Klasse braucht einen Destruktor" doch eigentlich Quatsch. Bei Klassen, die das ganze Programm über gebraucht werden, ist es doch dann meistens unnötig, überhaupt einen zu deklarieren, oder?

DGL-luke 26. Okt 2006 18:38

Re: Wann Destruktor-Aufruf nötig?
 
Eine Klasse weiß nicht, wie lange sie gebraucht wird(OOP). Sie sollte deshalb alles, was sie alloziiert, auch wieder freigeben. Das ist guter Stil.

Und Pauschalaussagen sind zwar meist kein "Quatsch", aber es gibt trotzdem immer Ausnahmen ;)

PS: Schon TObject hat einen Destruktor. EIne Klasse ohne Destruktor gibts also gar nicht :stupid:

Cöster 26. Okt 2006 19:11

Re: Wann Destruktor-Aufruf nötig?
 
Zitat:

Zitat von DGL-luke
Schon TObject hat einen Destruktor. EIne Klasse ohne Destruktor gibts also gar nicht :stupid:

Macht es bei Klassen, die von TObject direkt abgeleitet sind eigentlich sinn, inherited Create bzw. Destroy aufzurufen? Denn in TObject.Create bzw. Destroy passiert ja nix.

jbg 26. Okt 2006 20:42

Re: Wann Destruktor-Aufruf nötig?
 
Zitat:

Zitat von Cöster
Macht es bei Klassen, die von TObject direkt abgeleitet sind eigentlich sinn, inherited Create bzw. Destroy aufzurufen? Denn in TObject.Create bzw. Destroy passiert ja nix.

Nötig ist es nicht, da beide nichts machen. Das kann sich aber ändern. Und bei Delphi.NET hat es sich bereits geändert. Der .NET Compiler meckert wenn du kein inherited Create aufrufst.
Ein anderer Punkt ist, wenn man später mal feststellt, dass die Klasse doch besser von einer anderen Erben soll. In diesem Fall kann ein fehlender inherited Create Aufruf zu Problemen führen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:25 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz