Destructor in Delphi
lima-city → Forum → Programmiersprachen → Delphi & Pascal
array
automatisch erledigen
beleg
code
ende
freund url
http
index
kleine frage
objekt
parameter
schleife
standardeinstellung
teilweise recht url
treff
uninteressant url
url
verwenden
verzichten
wissen
-
Ich habe eine kleine Frage zum Thema Delphi bzw. die auch Allgemein zu verstehen ist.
Ich habe eine Klasse A und eine Klasse B die 5000 Objekte der Klasse A erstellt und in einem Array-Attribut speichert. Nun wird am Ende nur die Klasse B benutzt und am Ende "destroyed" werden dann automatisch auch alle Objekte der Klasse A die ich in der Klasse B benutzt habe "destroyed" ?
MFG Stefan -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ohne es genauer zu wissen, oder belegen zu können, behaupte ich mal: nein, der Speicher für die Objekte wird nicht automatisch freigegeben.
Da du dich selbst um das Erstellen der 5000 Objekte kümmerst, musst du dich auch selbst um das Bereinigen der Objekte kümmern. Delphi hat meines Wissens nach keinen "Garbage-Collector", wie beispielsweise Java.
Selbst wenn Delphi das für dich automatisch erledigen würde, ist es zumindest ein sehr sehr schlechter Programmierstil, den du dir von vornherein gar nicht angewöhnen solltest.
Nochmal recherchiert: ich hatte teilweise Recht:
http://www.delphi-treff.de/object-pascal/konstruktordestruktor/#c4951
Win32 verhält sich da wohl anders als .NET -
Also sollte ich jetzt für einen guten Programmierstil alle Objecte einfach über eine Schleife "destroyen" oder wäre jetzt "free" besser?
-
stef264 schrieb:
Also sollte ich jetzt für einen guten Programmierstil alle Objecte einfach über eine Schleife "destroyen" oder wäre jetzt "free" besser?
Google ist dein Freund:
http://www.delphipraxis.net/705207-post3.html
Solltest du lesen
Auch nicht uninteressant:
http://stackoverflow.com/questions/3159376/which-is-preferable-free-or-freeandnil -
Man könnte aber auch auf das Array verzichten und stattdessen eine TObjectList verwenden (Unit Contnrs). Im Destruktor der enthaltenden Klasse muss man dann nur diese freigeben, sofern man den optionalen Parameter OwnsObjects in deren Konstruktor auf der Standardeinstellung true belässt. Mögliche Vorgehensweise:
uses ..., Contnrs; type TUnterklasse = class ... end; TDeineKlasse = class private FObjects: TObjectList; function GetObject(Index: integer): TUnterklasse; ... public constructor Create; destructor Destroy; override; property Objects[Index: integer]: TUnterklasse read GetObject; default; ... end; constructor TDeineKlasse.Create; begin inherited; FObjects := TObjectList.Create; ... end; destructor TDeineKlasse.Destroy; begin FObjects.Free; ... inherited; end; function TDeineKlasse.GetObject(Index: integer): TUnterklasse; begin if (Index < 0) or (Index >= FObjects.Count) then raise EListError.Create('Index außerhalb des gültigen Bereichs'); Result := FObjects[Index] as TUnterklasse; end;
-
Hi,
Es kommt auch auf deine delphi version an.
Wenn du eine "normale" delphi version hast, hast du keine garbage collection
(Wennich dich richtig verstehe ist das ja das was du willst).
Nutzt du eine .net version von delphi sollte die garbage collection implizit eingebaut sein.
Gruß -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage