AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Rekursives Freigeben einer TStringList // Compilerfehler
Thema durchsuchen
Ansicht
Themen-Optionen

Rekursives Freigeben einer TStringList // Compilerfehler

Ein Thema von Caps · begonnen am 15. Jun 2020 · letzter Beitrag vom 16. Jun 2020
Antwort Antwort
Seite 3 von 4     123 4      
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#21

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 12:32
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (16. Jun 2020 um 12:59 Uhr) Grund: inherited vergessen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#22

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 12:37
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

Geändert von Delphi.Narium (16. Jun 2020 um 12:37 Uhr) Grund: Schreibfehler
  Mit Zitat antworten Zitat
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#23

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:07
Ok, aber wenn man nur den Destruktor von TObject aufruft, dann wird doch der Baum nicht rekursiv freigegeben?
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."

Geändert von Caps (16. Jun 2020 um 13:11 Uhr)
  Mit Zitat antworten Zitat
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#24

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:12
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.
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#25

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:14
Genau deshalb soll der Destruktor grundsätzlich überschrieben werden und nicht verdeckt. Probier es doch einfach mal aus.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#26

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:15
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?
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#27

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:16
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.
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#28

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:17
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.

Delphi-Quellcode:
destructor TStringTree.Destroy;
var
  i: Integer;
begin
  for i := 0 to Count-1 do
    Objects[i].Free;
  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?
Free ruft Destroy auf und das ist virtual .
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#29

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:22
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
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#30

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:29
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 Uhr.
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