![]() |
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Zitat:
|
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Wobei die Initialisierung von In_A streng genommen redundant ist, da strings als managed type automatisch initialisiert wird. Der Lesbarkeit halber würde ich das aber schon so lassen.
Zitat:
|
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Zitat:
Delphi-Quellcode:
Wenn an irgendeiner Stelle von "beliebiger code hier" eine Exception geworfen wird, oder mit Exit der Code verlassen werden soll, dann wird der finally-Block ohne Probleme abgearbeitet.
procedure foo;
var sl1, sl2: TStringList; begin sl1 := nil; sl2 := nil; try // beliebiger code hier sl1 := TStringList.Create; // beliebiger code hier sl2 := TStringList.Create; // beliebiger code hier finally sl1.Free; sl2.Free; end; end; |
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Das Problem wird nur sein, dass du dann nicht mehr den ursprünglichen Fehler mittels Exception-Handling abfangen kannst, weil du dann im
Delphi-Quellcode:
-Abschnitt eine Access-Violation bekommst.
finally
Auch geht das so nur bei objekten, die nicht voneinander abhängig sind. |
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Zitat:
BTW: Du weißt, dass die Methode
Delphi-Quellcode:
auf
Free
Delphi-Quellcode:
prüft bevor diese den Destructor aufruft? Also davon kann es keine AV geben.
nil
Zitat:
|
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Puh, da ist einiges falsch.
Das Create gehört vor den try. Dass das obige "sl1.Free;" funktioniert, liegt vielleicht nur daran, dass bei TStringList zufällig nichts schlimmes passiert. Free ruft Destroy() auf und wenn dort auf Felder zugegriffen wird, dann gibt es zwangsläufig eine Schutzverletzung. Wenn bei obigem "// beliebiger code hier" eine Exception passiert, dann bleibt sl1 nil "Dass die Methode Free auf nil prüft" ist auch falsch. FreeAndNil prüft dagegen. |
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Zitat:
Delphi-Quellcode:
procedure TObject.Free;
begin // under ARC, this method isn't actually called since the compiler translates // the call to be a mere nil assignment to the instance variable, which then calls _InstClear {$IFNDEF AUTOREFCOUNT} if Self <> nil then Destroy; {$ENDIF} end;
Delphi-Quellcode:
procedure FreeAndNil(var Obj);
{$IF not Defined(AUTOREFCOUNT)} var Temp: TObject; begin Temp := TObject(Obj); Pointer(Obj) := nil; Temp.Free; end; {$ELSE} begin TObject(Obj) := nil; end; {$ENDIF} |
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Zitat:
Das Create kann stehen wo will.
Delphi-Quellcode:
oder
var
f: TObject; begin f := TObject.Create; try finally f.Free; end; end;
Delphi-Quellcode:
Ist beides gleichwertig. Die zweite Variante macht allerdings nur dann richtig Sinn, wenn man mehrere Instanzen mit einem Resourcen-Schutzblock absichern kann/will.
var
f: TObject; begin f := nil; try f := TObject.Create; finally f.Free; end; end; Das mit dem Free und nil hat Uwe ja schon erklärt. Manchmal ist Erkenntnis nur einen Klick entfernt und da wundert man sich halt schon manchmal über das was hier an Wissen offenbart wird. |
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Dazu gibt es ja zum Glück das Forum.
Asche auf mein Haupt. Tut mir leid. :oops: Ich war mir so sicher ... War das schon immer so? Lustig: Habe nach "procedure TObject.Free;" bei mir gesucht und gefunden:
Delphi-Quellcode:
Allerdings stand oben drin "Turbo Pascal Version 7.0" :wink:
procedure TObject.Free;
begin Dispose(PObject(@Self), Done); end; |
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 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