![]() |
Objekte (Klassen) freigeben notwendig?
Hallo,
muss ich eine Klasse freigeben, bevor die Procedure verlasen wird, wo Sie erzeugt wurde? Oder räumt Delphi automatisch auf? Beispiel:
Delphi-Quellcode:
Procedure Tmainform.test
var Kasse: TclsKasse; Begin Kasse:=tclsKasse.Create; Kasse.DoSomething; Kasse.Free; // <--- Ist das Notwendig? end; |
Re: Objekte (Klassen) freigeben notwendig?
Hallo Alfonso!
Ja, es ist nötig. Du solltest dazu mit einem try-finally-Block arbeiten:
Delphi-Quellcode:
Das bewirkt, daß Dein Objekt auch dann wieder freigegeben wird, wenn in der Verarbeitung irgendetwas schief geht.Begin Kasse:=tclsKasse.Create; try Kasse.DoSomething; finally Kasse.Free; // Das ist Notwendig end; end; Gruß onlinekater |
Re: Objekte (Klassen) freigeben notwendig?
Zitat:
Sorry, bin grad etwas im Klugscheissmodus, aber Klassen kann man gar nicht freigeben, weil sie ja 'nur' der Bauplan für konkrete Instanzen, also die Objekte sind. Um die Frage richtig zu interpretieren: Ja, Du musst ein Objekt welches Du in einer Methode instanziert hast auch wieder freigeben. Lokale Variablen wie strings, Ganz- oder Fließkommazahlen werden von Delphi selber erzeugt und wieder freigegeben, aber Variablen die Objekte beherbergen sind für Delphi nur Zeiger. Der Speicherplatz für den Zeiger wird zwar erzeugt und auch automatisch freigeräumt, nicht jedoch der Speicher, auf den dieser Zeiger zeigt. Will heissen wenn Du ein Objekt erzeugst und einer lokalen Variablen zuweist, so reservierst Du den Speicher und nach dem beenden wird der Zeiger auf diesen Speicher weggeworfen, Du hast also Speicher angefordert, bekommst aber hinterher nie mehr heraus, wo denn dieser Speicher liegt um ihn zurückzugeben. Das nennt sich Speicherleck und sollte idealerweise vermieden werden. |
Re: Objekte (Klassen) freigeben notwendig?
prinzipiell gilt in Delphi. Speicher den du selbst Anforderst musst du auch selbst frei geben.
TObjec.Create fordert auch speicher an, und somit solltest du den Speicher auch freigeben. Es gibt eine Ausnahme wo man speicher nicht freigeben muss (aber kann): Alle Klassen die von TComponent abgleitet sind bzw. TComponent selbst haben beim Constructor den Parameter Owner. Ezreugst du eine Komponente (TComponent + Nachfahren) und übergibst dort einen Owner so wird deine Komponente frei gegeben wenn der Owner frei gegeben wird. Es schade allerdings auch nicth wenn du die Komponente selbst frei gibst bevor du den Owner frei gibst. Man sollte sich generell angewöhnen Speicher den man angefordert hat auch wieder frei zu geben. |
Re: Objekte (Klassen) freigeben notwendig?
Zitat:
Delphi-Quellcode:
Warum heißt es dann nicht Klassenorientierte Programmierung :mrgreen: .
type
TMyObject = object end; |
Re: Objekte (Klassen) freigeben notwendig?
Vielen Dank für eure Antworten.
Ich hatte es mir ja schon gedacht, aber ganz sicher war ich mir nicht. Ich habe halt bisher Objekte in Form von Komponenten kennengelernt, und dort werden Sie vom Formular freigegeben. Eigene Objekte hatte ich bisher nicht. Gruß und Danke Alfonso |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 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