![]() |
Objekte in Klassen: Was wird alles zerstört?
Hi!
Ich habe eine kleine Frage... Ich habe mehrere Klassen in meinem Projekt. Diese haben verschiedene Objekte als Felder/Properties. Und diese Objekte haben auch wieder Objekte etc. Daher ist meine Frage: Wenn ich die Klasse zerstöre, die alle anderen Objekte beinhaltet: Was wird dabei automatisch zerstört? Muss ich noch irgendwas selber freigeben? Ein einfacher Beispielcode ist sowas hier:
Delphi-Quellcode:
So in etwa, vom Prinzip her.
type TKlasseA = class
a: integer; //irgend ein Feld, ist ja egal, was es genau ist end; TKlasseB = class KlasseA: TKlasseA; end; TSuperKlasse = class KlasseB: TKlasseB; end; Wenn ich jetzt ein Objekt der Klasse "TSuperKlasse" zerstöre: Werden dann KlasseA und KlasseB auch gleich mit zerstört? Oder muss ich da noch auf irgendwas aufpassen? |
Re: Objekte in Klassen: Was wird alles zerstört?
Eine Klase als Field ist nichts weiteres als ein Pointer. Wenn du die Speicher dafür reservierst, dann musst du es selber wieder freigeben.
|
Re: Objekte in Klassen: Was wird alles zerstört?
Für solche Aufgaben gibt es den Destructor ;) Der ist dafür verantwortlich, den angelegten Speicherplatz wieder freizugegeben.
|
Re: Objekte in Klassen: Was wird alles zerstört?
Zitat:
Der Hintergrund ist jetzt speziell auch der, dass ich beim Debuggen auf eine Objektfreigabe gestoßen bin, die eine Exception auslöst. Und da wollte ich das zuerst einmal geklärt haben, damit ich diesbezüglich keinen Murks mache ;) |
Re: Objekte in Klassen: Was wird alles zerstört?
Solange es keine wirkliche Garbage Collection in Delphi gibt, kann der Compiler ja nicht wissen, ob das Feld die einzige Referenz auf das Objekt ist. Also musst du selbst entscheiden, ob das Objekt freigegeben werden kann.
|
Re: Objekte in Klassen: Was wird alles zerstört?
Vielleicht hilfts ja ...
Objekte die du selbst über Quellcode zum Leben erweckst, mußt Du in der Regel auch selbst wieder sterben lassen. |
Re: Objekte in Klassen: Was wird alles zerstört?
Komisch finde ich nur, dass ich im Destructor von "TSuperKlasse" nicht auf KlasseA und KlasseB zugreifen kann. Das bringt mir eine Exception... Woanders geb ich die eigentlich nicht frei. DEshalb ist das sehr verwirrend.
|
Re: Objekte in Klassen: Was wird alles zerstört?
Hm Du solltest im Destructor von SuperKlasse auch nur Klasse B freigeben (mit Free), dadurch wird der Destructor der Klasse B aufgerufen wo Du dann Klasse A freigeben kannst.
Poste doch mal den Code, womit Du Probleme hast, dann kann man sicher leichter helfen. |
Re: Objekte in Klassen: Was wird alles zerstört?
Zitat:
Zitat:
|
Re: Objekte in Klassen: Was wird alles zerstört?
Wenn du von TComponent abgeleitet hast wird dein Object freigegeben wenn der Owner freigegeben wird (falls du einen angegeben hast beim Create). Wenn du Komponenten frei gibst wo andere Komponenten drauf liegen so werden auch die Childs freigegeben (dann wird dein Control also freigegeben wenn es mindestens von TControl abgeleitet ist und auch einen Parent zu gewiesen bekommen hat). Alles andere musst du selbst freigeben sofern du es auch angelegt hast. Es schadet allerdings nicht auch Komponenten explizit freizugeben selbst wenn sie einen Owner haben.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 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 by Thomas Breitkreuz