![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:03 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