![]() |
Delphi-Version: 10.3 Rio
Verständnisfrage Assigned vs nil
Hi zusammen
Was ist der Unterschied zwischen einer Abfrage eines Objektes auf Nil bzw. assigned?
Delphi-Quellcode:
Assigned mag zwar eleganter klingen, aber das ist wohl kaum dessen Sinn.
if Assigned(FSQLiteFolderList) then
if FSQLiteFolderList = nil then Gruss Delbor |
AW: Verständnisfrage Assigned vs nil
Ich glaube wenn man mit
Delphi-Quellcode:
etwas freigibt, ist
.Free
Delphi-Quellcode:
False und
Assigned()
Delphi-Quellcode:
auch False.
= nil
Deswegen setze ich manuell immer alles auf nil wenn ich etwas mit Free freigebe. Nagel mich nicht drauf fest. Bin mir unsicher. |
AW: Verständnisfrage Assigned vs nil
|
AW: Verständnisfrage Assigned vs nil
Zitat:
|
AW: Verständnisfrage Assigned vs nil
Zitat:
|
AW: Verständnisfrage Assigned vs nil
Hi zusammen
Danke für eure Antworten. Offenbar habe ich asssigned etwas überschätzt. Gruss Delbor |
AW: Verständnisfrage Assigned vs nil
Wenn du deine Variable nach Free immer manuell auch auf nil setzt ist alles gut.
|
AW: Verständnisfrage Assigned vs nil
Hi Dolly
Zitat:
Gruss Delbor |
AW: Verständnisfrage Assigned vs nil
Folgende Abfragen sind gleichwertig:
Delphi-Quellcode:
Erstere Variante ist IMO etwas einfacher zu lesen, wenn man gerade in einem Editor ohne Syntaxhervorhebung unterwegs ist, in dem auch noch die Schrift etwas klein ist und man so Schwierigkeiten hat, schmale Zeichen sauber zu erkennen. Aber grundsätzlich soll jeder das verwenden, was er/sie mag.
if Assigned(Objekt) then
if Objekt <> nil then Grüße Dalai |
AW: Verständnisfrage Assigned vs nil
Bei Abfragen von Objekten sind die Abfragen auf nil und auf Assigned gleichwertig. Anders sieht es z.B. bei Events aus. Man kann eine Event-Variable (so wie jeden Methodenzeiger) nicht auf nil abfragen. Dafür ist dann Assigned gedacht.
Delphi-Quellcode:
procedure TCustomForm.Paint;
begin if Assigned(FOnPaint) then FOnPaint(Self); end; |
AW: Verständnisfrage Assigned vs nil
Zitat:
|
AW: Verständnisfrage Assigned vs nil
Zitat:
|
AW: Verständnisfrage Assigned vs nil
Man könnte ja auch einfach mal die
![]() |
AW: Verständnisfrage Assigned vs nil
Hallo,
Tipp: Beim Zuweisungstest von Objektereignissen und -prozeduren können Sie nicht auf nil testen. Dazu müssen Sie Assigned verwenden. Da steht es ;) |
AW: Verständnisfrage Assigned vs nil
Sag ich ja ;)
|
AW: Verständnisfrage Assigned vs nil
Zitat:
Wenn etwas mit
Delphi-Quellcode:
freigegeben wird, dann ergibt die Abfrage mit
.Free
Delphi-Quellcode:
TRUE und die Abfrage auf
Assigned()
Delphi-Quellcode:
FALSE.
= nil
Wenn etwas mit
Delphi-Quellcode:
freigegeben wird, dann ergibt die Abfrage mit
FreeAndNil()
Delphi-Quellcode:
FALSE und die Abfrage auf
Assigned()
Delphi-Quellcode:
TRUE.
= nil
|
AW: Verständnisfrage Assigned vs nil
Zitat:
|
AW: Verständnisfrage Assigned vs nil
Delphi-Quellcode:
Wer will, der kann alles.
procedure TCustomForm.Paint;
begin if TMethod(FOnPaint).Code <> nil then FOnPaint(Self); end; Methoden-Zeiger bestehen intern aus zwei Pointern (auf die Prozedur und auf das Object/Self). Aber Assigned kennt die Unterschiede und nimmt dann die passende Prüfung vor. Assigned und <>nil sind gleich, egal ob man mit Free oder FreeAndNil arbeitet. Bei Free bleibt halt nur der nun "ungülige" Zeiger in der Variable drin, weswegen man das prüfen kann was man will.
Delphi-Quellcode:
FreeAndNil macht hier aber erst nil und dann Free (mit temporäter Variable dazwischen), damit wenn es im Free (Destroy) knallt, die Variable dennoch auf nil gesetzt wird/wurde.
obj.Free;
obj := nil; Noch mehr Spaß macht es bei den generischen References (
Delphi-Quellcode:
... die Zeiger wo Prozeduren und Methoden drin sein können),
reference to procedure
denn da hast du ein "geheimes" Interface, wo dann der Zeiger drin ist. @DasWolf Versuch dir nicht zu merken wie es unterschiedlich ist, sondern merk es dir so, dass es gleich ist.
Delphi-Quellcode:
=
o <> nil
Delphi-Quellcode:
Assigned(o)
Delphi-Quellcode:
=
o = nil
Delphi-Quellcode:
not Assigned(o)
und nach
Delphi-Quellcode:
ist eine Variable ungülig, also will man nachher auf nil/Assigned prüfen, dann muß auch auf NIL gesetzt werden (z.B. durch FreeAndNil).
o.Free
|
AW: Verständnisfrage Assigned vs nil
Nochmal aus der Doku:
Zitat:
|
AW: Verständnisfrage Assigned vs nil
Wenn ich ein Objekt nach der Freigabe im Code nachher auf Nil testen muss, dann habe ich was falsch gemacht. Wir hatten hier mal die Diskussion warum FreeAndNil schlechter Stil ist. Vielleicht findet die noch jemand. Da würde das sehr schlüssig erklärt von einem Mitglied.
|
AW: Verständnisfrage Assigned vs nil
Hallo,
Zitat:
der Zugriff auf das freigegebene Objekt kann noch funktionieren, gerade, wenn es auf dem Stack liegt (lokales Objekt). Es muss aber auch nicht funktionieren. |
AW: Verständnisfrage Assigned vs nil
Zitat:
Delphi-Quellcode:
Deshalb rate ich jedem, immer zu prüfen, egal ob es unnötig erscheint oder nicht.
procedure Test;
var o: TMyObj; begin o := TMyObj.Create; try ... ... finally o.Free; end; end; |
AW: Verständnisfrage Assigned vs nil
Die Diskussion hatte IMHO der gute Nick Hodges in seinem
![]() Sherlock |
AW: Verständnisfrage Assigned vs nil
Eine Variable mit einem Objekt während der Lebenszeit dieser Variable.
Free reicht, wenn nach dem Free nicht mehr auf die Variable zugegriffen wird. Gibt es aber mehrere Stellen wo erstellt oder freigegeben wird, dann muß die Variable auch auf nil gesetzt werden. Eine Variable wo während der Laufzeit mehrere Objekte drin gespeichert/verlinkt sind und zwischendurch auch mal nichts drin stehen kann, dann ebenfalls nil setzen. Ob nun FreeAndNil oder Free plus :=nil das sei jedem selbst überlassen. Immer FreeAndNil, falls ich mal irgendwo scheiße bau und nicht mehr weiß was ich wo mache = schwachsinn sinnlos, siehe Nicks Blog. Aber hier *muss* nil gesetzt werden, am Besten via FreeAndNil, falls es im Free/Destroy knallen kann, sonst knallt es bestimmt nochmal beim letzten Free und schrottet mir die originale Fehlermeldung/Fehlerposition.
Delphi-Quellcode:
o := TMyObj.Create;
try ... FreeAndNil(o); ... finally o.Free; // hier ist intern ein IF ASSIGNED(SELF) drin end;
Delphi-Quellcode:
@DasWolf: Jupp, also wie gesagt, wird nach dem Free nochmal irgendwie auf den Inhalt zugegriffen, dann NIL nicht vergessen zu setzen.
o := nil; // genauso, wie das hier nicht vergessen werden darf
try ... o := TMyObj.Create; ... FreeAndNil(o); ... finally o.Free; // hier ist intern ein IF ASSIGNED(SELF) drin end; Und auf die grauenhaften Besonderheiten im NextGen will jetzt niemand eingehen. (ich sag nur "Free" macht garnichts und Objekte werden nicht da freigegeben wo und wann ich es will/erwarte) PS: Wäre der Compiler intelligent genug und täte beim .Free oder .Destroy den Status der Variable zurück auf "nicht initilisiert" setzen, wann gäbe es hier
Delphi-Quellcode:
eine der bekannten Warnungen, beim nachfolgenden Zugriff. (Variable nicht initialisiert)
x.Free;
if Assigned(X) then // oder x.Free; x.irgendwas; |
AW: Verständnisfrage Assigned vs nil
Bitte lasst doch die Diskussion, die wurde schon gefühlt tausendfach geführt.
Es geht hier doch um Assigned vs nil |
AW: Verständnisfrage Assigned vs nil
Zitat:
Objekte liegen nicht auf dem Stack (außer manchmal deren Variable), aber ja, wenn der speichermanager das Block noch nicht freigeben und auch noch nicht anders wiederverwendet hat, dann stimmt es natürlich. PS: Darum gibt es in einigen Speichermanagern/Debuggingtools eine Option ala "markiere freigegeben Speicher" (fülle mit hübschen Bytes), bzw. notfalls auch "leere/nulle freigegebenen Speicher", um solche Fehler leichter finden zu können. (z.B. im großen FastMM) Aber bei Speicher wurde bereits neu vergeben, dagegen ist ein Kraut gewachsen, drum hilft sowas nur bedingt. (außer man bringt den Speichermanager dazu den Speicher nicht freizugeben oder neuzuvergeben, aber dann wird der Speicher schnell voll) |
AW: Verständnisfrage Assigned vs nil
Also ich habe eine einfache Regel: IMMER Assigned() benutzen ...
Wozu = nil benutzen ? Das bringt doch nur zusätzliche Fehlermöglichkeiten rein. Der einzige Nachteil ist, das mehr Buchstaben zu schreiben sind :stupid: |
AW: Verständnisfrage Assigned vs nil
Zitat:
Ist halt alles Geschmackssache... |
AW: Verständnisfrage Assigned vs nil
Ja ich bin wohl noch jemand der versucht allen Dingen eindeutige Namen zu geben,
deshalb sehe ich sofort ob es Methoden, Felder, Parameter, etc.. Aber so hat eben jeder seine Macke :stupid: |
AW: Verständnisfrage Assigned vs nil
Zitat:
|
AW: Verständnisfrage Assigned vs nil
Zitat:
z.B.
Delphi-Quellcode:
Würde ich auf NIL testen müßte beim ersten Eintritt sichergestellt sein daß eine Initialisierung mit NIL vorgenommen wurde. Ebenso müßte immer ein .FreeandNil durchgeführt werden, denn ein einfaches .Free ist u.U. zu wenig.
var
MyFileList : Tstringlist; .... if assigned(Myfilelist) then Myfilelist.Clear else MyFilelist.create; // mach irgendwas MyFilelist.......// irgendwas oder auch nichts Gruß K-H Nachtrag: Ich weiß daß es einen Beitrag gab der begründete warum FreeandNil nicht optimal ist. Aber bisher hab ich nur die gegenteilige Aussage gefunden und einmal "schon wieder FreeandNil" Augenrollen. |
AW: Verständnisfrage Assigned vs nil
Zitat:
Zitat:
Delphi-Quellcode:
ist genau das selbe wie
if assigned(Myfilelist) then
Delphi-Quellcode:
und wie soll assigned helfen bei FreeAndNil und .Free? Das eine hat doch mit dem anderen nichts zu tun?
if Myfilelist<>nil then
|
AW: Verständnisfrage Assigned vs nil
Folgender Code:
Delphi-Quellcode:
ergibt compiliert (ohne das Lead-In/Out der Methode):
var
instance: TObject; begin if Assigned(instance) then; if instance <> nil then; end;
Delphi-Quellcode:
Unit475.pas.37: if Assigned(instance) then;
005FD1D0 837DF800 cmp dword ptr [ebp-$08],$00 Unit475.pas.38: if instance <> nil then; 005FD1D4 837DF800 cmp dword ptr [ebp-$08],$00 |
AW: Verständnisfrage Assigned vs nil
Ich muß Abbitte leisten:stupid:
nach einem
Delphi-Quellcode:
ist ein
liste.Free
Delphi-Quellcode:
) true und ein
Assigned(liste
Delphi-Quellcode:
natürlich false.
liste=NIL
Dementsprechend ist ein .FreeandNil (falls anwendbar) einem .Free vorzuziehen falls die Möglichkeit besteht, das das Objekt noch einmal genutzt wird. Gruß K-H |
AW: Verständnisfrage Assigned vs nil
Zitat:
|
AW: Verständnisfrage Assigned vs nil
Zitat:
|
AW: Verständnisfrage Assigned vs nil
Ich kanns mir nicht verkneifen dieses alte Thema nochmal hochzuholen.
Weil es dazu ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 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