Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Rekursives Freigeben einer TStringList // Compilerfehler (https://www.delphipraxis.net/204647-rekursives-freigeben-einer-tstringlist-compilerfehler.html)

DeddyH 16. Jun 2020 11:32

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Delphi-Quellcode:
destructor TStringTree.Destroy;
var
  i: Integer;
begin
  for i := 0 to Count-1 do
    Objects[i].Free;
  inherited;
end;
Sollte dasselbe bewirken, nur kürzer.

Delphi.Narium 16. Jun 2020 11:37

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Delphi-Quellcode:
destructor TStringTree.Destroy;
var
  i: Integer;
begin
  for i := 0 to Count - 1 do FreeAndNil(Objects[i]);
end;
Ohne die Abfrage, ob's nun 'ne TStringList ist oder nicht, hat es den Vorteil, dass alle Objekte freigegeben werden und nicht nur die Stringlisten. Spart (vermutlich) das eine oder andere Speicherleck ;-)

Caps 16. Jun 2020 12:07

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Ok, aber wenn man nur den Destruktor von TObject aufruft, dann wird doch der Baum nicht rekursiv freigegeben?

Caps 16. Jun 2020 12:12

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1467421)
Ohne die Abfrage, ob's nun 'ne TStringList ist oder nicht, hat es den Vorteil, dass alle Objekte freigegeben werden und nicht nur die Stringlisten. Spart (vermutlich) das eine oder andere Speicherleck ;-)

Aber in #19 gebe ich doch alle Objekte frei.

DeddyH 16. Jun 2020 12:14

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Genau deshalb soll der Destruktor grundsätzlich überschrieben werden und nicht verdeckt. Probier es doch einfach mal aus.

Caps 16. Jun 2020 12:15

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1467416)
Das geht auch einfacher:
Delphi-Quellcode:
destructor TStringTree.Destroy;
var
  i: Integer;
begin
  for i:=0 to Count-1 do begin
    Objects [i].Free;
    Objects [i] := nil;
  end;

  inherited;
end;

Aber wird bei Objects [i].Free nicht nur der Destruktor von TObject aufgerufen?
Es soll ja aber mein Destruktor aufgerufen werden. Warum muss ich da nicht casten?

Caps 16. Jun 2020 12:16

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Zitat:

Zitat von DeddyH (Beitrag 1467426)
Genau deshalb soll der Destruktor grundsätzlich überschrieben werden und nicht verdeckt. Probier es doch einfach mal aus.

Achso, es gibt dann in der ganzen Hierarchie nur noch exakt einen Destruktor?
Das wusste ich nicht. Ok, dann macht es Sinn :). Man lernt nie aus.

Uwe Raabe 16. Jun 2020 12:17

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1467421)
Delphi-Quellcode:
destructor TStringTree.Destroy;
var
  i: Integer;
begin
  for i := 0 to Count - 1 do FreeAndNil(Objects[i]);
end;

Es fehlt nicht nur der Aufruf von inherited, sondern unter 10.3 und älter compiliert es gar nicht.

Der Code von DeddyH ist vollkommen ausreichend.

Zitat:

Zitat von DeddyH (Beitrag 1467418)
Delphi-Quellcode:
destructor TStringTree.Destroy;
var
  i: Integer;
begin
  for i := 0 to Count-1 do
    Objects[i].Free;
  inherited;
end;

Zitat:

Zitat von Caps (Beitrag 1467427)
Aber wird bei Objects [i].Free nicht nur der Destruktor von TObject aufgerufen?
Es soll ja aber mein Destruktor aufgerufen werden. Warum muss ich da nicht casten?

Free ruft Destroy auf und das ist
Delphi-Quellcode:
virtual
.

Caps 16. Jun 2020 12:22

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Ok, ich glaube da komme ich an die Grenzen meiner OOP-Kenntnisse ^^.
Es gibt also nicht nur ein Destroy, weil inherited ja ein Vorfahr-Destroy aufruft, oder?
Ich glaube jetzt bin ich verwirrter als vorher :shock:

DeddyH 16. Jun 2020 12:29

AW: Rekursives Freigeben einer TStringList // Compilerfehler
 
Virtuelle und dynamische Methoden können überschrieben werden. Wenn eine solche Methode einer Instanz aufgerufen wird, wird die Virtual Method Table (VMT) durchlaufen, ausgehend von der Klasse der Instanz in der Hierarchie aufsteigend, bis eine Implementation gefunden wird. Die wird dann abgearbeitet. Normalerweise möchte man die Methode aber nicht komplett ersetzen, sondern nur erweitern, weswegen man dann inherited aufruft, um die nächste Implementation in den höher gelegenen Klassen auszuführen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:42 Uhr.
Seite 3 von 4     123 4      

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