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
Caps

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

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 12: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 12:11 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Rekursives Freigeben einer TStringList // Compilerfehler

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

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 12: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.669 Beiträge
 
Delphi 12 Athens
 
#4

AW: Rekursives Freigeben einer TStringList // Compilerfehler

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

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

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 12:38
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.
Ok, ich glaub das wird OT

Aber warum wird dann bei Objects [i].Free der Destruktor von TStringTree aufgerufen?
Woher weiß denn der Compiler, welcher Typ da drin steckt?
Also was ich meine ist: wenn ich von einer Basisklasse zwei verschiedene Klassen ableite, und dann den Destruktor der Basisklasse (TObject) aufrufe, dann kann der Compiler doch gar nicht entscheiden, welcher Typ nun wirklich an dem Zeiger dranhängt, oder bin ich völlig abwegig?
Vermutlich müsste das mal in einen anderen Thread (OOP oder so ^^)
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.749 Beiträge
 
Delphi 12 Athens
 
#6

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:23
Da außen die Variable NIL werden soll, das aber beim Property "Objects" nicht geht, macht es sich mit "einer" Funktion nicht so gut.

Delphi-Quellcode:
procedure FreeStringList(const [ref] List: TStrings);
procedure Walk(Obj: TObject);
  begin
    if Obj is TStrings then
      for var Obj2 in TStrings(Obj).ToObjectArray do
        Walk(Obj2);
    Obj.Free;
  end;
begin
  // wie FreeAndNil : modern, typsicher mit CONST-REF -> https://dalijap.blogspot.com/2020/06/magic-behind-freeandnil.html
  var Temp := List;
  TObject(Pointer(@List)^) := nil;
  Walk(Temp);
end;
bzw.
Delphi-Quellcode:
procedure FreeStringList(var List{: TStrings});
procedure Walk(Obj: TObject);
  var
    i: Integer;
  begin
    if Obj is TStrings then
      for i := TStrings(Obj).Count-1 downto 0 do
        Walk(TStrings(Obj).Objects);
    Obj.Free;
  end;
var
  Temp: TStrings;
begin
  // wie FreeAndNil : alt, mit VAR im Funktionskopf
  Temp := TStrings(List);
  List := nil;
  Walk(Temp);
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (16. Jun 2020 um 14:49 Uhr) Grund: den Code aufgeteilt (neu und alt getrennt)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Rekursives Freigeben einer TStringList // Compilerfehler

  Alt 16. Jun 2020, 13:39
Das wird Delphi 5 aber freuen, was es plötzlich so alles kann
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


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 11:19 Uhr.
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