Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi bereits freigegeben? (https://www.delphipraxis.net/7316-bereits-freigegeben.html)

moin339 8. Aug 2003 23:33


bereits freigegeben?
 
Moin!

Wie kann man feststellen ob eine klasse bereits über free freigegeben wurde?

Delphi-Quellcode:
var Test: TTest

implementation

procedure bla;
begin
  if bereitsFreigegeben(Test) then showmessage('test wurde freigegeben');
end;
ciao, moin339

Christian Seehase 8. Aug 2003 23:56

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:
if ObjektVariable <> nil then ShowMessage('Objekt existiert');
möglich ist.

Ersetzten lässt sich FreeAndNil durch

Delphi-Quellcode:
ObjektVariable.Free;
ObjektVariable := nil;

moin339 9. Aug 2003 10:09

Re: bereits freigegeben?
 
danke, funktioniert wunderbar

Pascal 11. Aug 2003 22:52

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:
if ObjektVariable <> nil then ShowMessage('Objekt exisitiert');
die Abfrage
Delphi-Quellcode:
if not assigned(ObjektVariable) then ShowMessage('Objekt exisitiert');
Dies wird von Delphi empfohlen, die genauen Gründe kenne ich auch nicht.

Gruß Pascal

Chewie 11. Aug 2003 22:59

Re: bereits freigegeben?
 
Ich perrsönlich bevorzuge die erste Methode, da sie schneller ist (wenn auch nur ein paar Takte :wink: ).

Luckie 11. Aug 2003 23:09

Re: bereits freigegeben?
 
Bei "Assigned" wird aber klarer, was passiert. Ist letztendlich aber geschmackssache.

jbg 11. Aug 2003 23:25

Re: bereits freigegeben?
 
Zitat:

Zitat von Chewie
Ich perrsönlich bevorzuge die erste Methode, da sie schneller ist (wenn auch nur ein paar Takte :wink: ).

Wie hast du denn das herausbekommen?


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)

Chewie 12. Aug 2003 16:27

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.

jbg 12. Aug 2003 16:56

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.

Chewie 12. Aug 2003 17:12

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