![]() |
Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Hallo zusammen,
vielleicht stehe ich ja nur unglaublich auf dem Schlauch aber müsste in dem Codebeispiel "Assigned(slShow)" nicht false sein?
Delphi-Quellcode:
Wenn nein: Wie prüfe ich denn richtig, ob slShow freigeben kann/muss?
procedure TfMain.Button1Click(Sender: TObject);
var In_A: string; slShow: TStringList; begin In_A := ''; try if In_A = '' then exit; slShow := TStringList.Create; finally if Assigned(slShow) then slShow.Free; end; end; Aber - und mindestens genauso schlimm - die Zeile "if Assigned(slShow) then" wird ja nur ausgeführt, weil das "exit" zu einer Access Violation führt! Ist vielleicht meine Installation kaputt? Bin dankbar für jede Hilfe! Gruß Freejay PS: Das ist ein Testprojekt mit zwei Buttons, einem Memofeld und einem Opendialog. Sonst nix. Frisch zusammengebastelt. |
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert
Zitat:
Zitat:
Zitat:
|
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Die Prüfung wird vom Free doch selbst schon durchgeführt, das kannst Du Dir von daher eigentlich sparen.
Und alles hinter dem finally wird immer ausgeführt. |
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Zitat:
Zitat:
Delphi-Quellcode:
und dem zugehörigen
finally
Delphi-Quellcode:
.
end
|
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Fassen wir alles zusammen, dann ergibt sich
Delphi-Quellcode:
procedure TfMain.Button1Click(Sender: TObject);
var In_A: string; slShow: TStringList; begin In_A := ''; slShow := nil; try if In_A = '' then exit; slShow := TStringList.Create; finally slShow.Free; end; end; |
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Hey, danke Euch beiden. :thumb:
Nach 20 Jahren Delphi ein paar Basics aufgefrischt... Irgendwas fällt immer mal wieder hinten runter, wenn man's lange nicht braucht... :roll: |
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
Mein Delpbi gibt mir bei der Variante aus dem Eingangspost immer eine Compilerwarnung aus.
Beim slShow.Free sagt es, dass slShow eventuell nicht initialisiert sein könnte. Eben weil alles zwischen finally und dem zugehörigen end ausgeführt wird, das Create wird aber nicht immer ausgeführt, da die Routine ja mit exit vorher verlassen wird. Daher: Compilerwarnungen beachten, sie sind manchmal lässtig, aber immer hilfreich. ;-) |
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Zitat:
Die Zeile "slShow := TStringList.Create;" sollte vor dem try stehen. |
AW: Prüfung auf Assigned(MyObject) true obwohl MyObject nicht initialisiert wurde
Hallöle...8-)
Besser...
Delphi-Quellcode:
oder
procedure TfMain.Button1Click(Sender: TObject);
var In_A: string; slShow: TStringList; begin In_A := ''; slShow := TStringList.Create; try if In_A = '' then exit; finally slShow.Free; end; end;
Delphi-Quellcode:
oder
procedure TfMain.Button1Click(Sender: TObject);
var In_A: string; slShow: TStringList; begin In_A := ''; if In_A = '' then begin exit; end else begin slShow := TStringList.Create; try // deins finally slShow.Free; end; end; end;
Delphi-Quellcode:
procedure TfMain.Button1Click(Sender: TObject);
var In_A: string; slShow: TStringList; begin In_A := ''; if not (In_A = '') then begin slShow := TStringList.Create; try // deins finally slShow.Free; end; end; end; |
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 22:07 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 by Thomas Breitkreuz