![]() |
bereits freigegeben?
Moin!
Wie kann man feststellen ob eine klasse bereits über free freigegeben wurde?
Delphi-Quellcode:
ciao, moin339
var Test: TTest
implementation procedure bla; begin if bereitsFreigegeben(Test) then showmessage('test wurde freigegeben'); end; |
Re: bereits freigegeben?
Moin moin,
ob ein Objekt mit Free freigegeben wurde kannst Du nicht überprüfen, da mit Free die Resourcen freigegeben werden (hoffentlich alle ;-)), die Variable aber weiterhin eine Adresse auf ein nun nicht mehr existentes Objekt enthält. (Von der "brutal" Methode auf einen Bestandteil (Methode oder Eigenschaft) in einem try/except Block zuzugreifen, und im Falle einer Exception zu entscheiden, dass das Obekt nicht mehr existiert. Dies nur der Vollständigkeit halber erwähnt.) Um ein Objekt so freizugeben, dass eine Überprüfung möglich ist, gibt es (ich glaube seit D4) die Prozedure FreeAndNil. Hiermit wird das Objekt freigegeben, und anschliessend, die Variable auf auf nil gesetzt, so dass dann die Abfrage
Delphi-Quellcode:
möglich ist.
if ObjektVariable <> nil then ShowMessage('Objekt existiert');
Ersetzten lässt sich FreeAndNil durch
Delphi-Quellcode:
ObjektVariable.Free;
ObjektVariable := nil; |
Re: bereits freigegeben?
danke, funktioniert wunderbar
|
Re: bereits freigegeben?
Kleine Anmerkung noch (habe ich selber erst vor kurzem erfahren):
Wenn du dies unter Delphi 7 testen willst, nehme statt
Delphi-Quellcode:
die Abfrage
if ObjektVariable <> nil then ShowMessage('Objekt exisitiert');
Delphi-Quellcode:
Dies wird von Delphi empfohlen, die genauen Gründe kenne ich auch nicht.
if not assigned(ObjektVariable) then ShowMessage('Objekt exisitiert');
Gruß Pascal |
Re: bereits freigegeben?
Ich perrsönlich bevorzuge die erste Methode, da sie schneller ist (wenn auch nur ein paar Takte :wink: ).
|
Re: bereits freigegeben?
Bei "Assigned" wird aber klarer, was passiert. Ist letztendlich aber geschmackssache.
|
Re: bereits freigegeben?
Zitat:
Annahme: P steht in EBX if P <> nil then -> test ebx, ebx if not Assigned(P) then -> test ebx, ebx Und wie können zwei gleiche Maschinencodes unterschiedlich schnell sein?(Stromschwankungen jetzt mal ausgeschlossen) |
Re: bereits freigegeben?
Ich habs nicht ausprobiert und kenn mich auch nicht so gut aus wie du, was genau passiert, wenn eine Prozedur aufgerufen wird, aber ich meine, ein einfacher Vergleich (auf nil) ist schneller durchgeführt als das Aufrufen einer Prozedur und das Prüfen in dieser.
|
Re: bereits freigegeben?
Nur mit dem Unterschied, das Assigned weder Funktion noch Prozedur ist, sondern Compiler Magic. Du siehst es doch an meinem Quellcode <-> Assembler vergleich, dass der Compiler für beides ein und denselben Maschinencode erzeugt.
|
Re: bereits freigegeben?
OK, falls du es überprüft hast, dann hast du wohl Recht.
Aber wir hatten das mal in einem anderen Thread, und da hat jemand (Assarbad?) gemeint, dass Assigned eine eigene Prozedur ist und nicht einem Vergleich auf nil entspricht. Natürlich ist das auch kein Wahrheitsbezeugnis, aber es klang einleuchtend. Vielleicht ist das aber auch von der verwendeten Delphi-Version abhängig (<=D4 als Prozedur, D5> Compiler Magic??). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 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