Zitat von
DGL-luke:
Delphi-Quellcode:
if assigned(myobj) then
dosomething;
wenn der zeiger anständig nil gesetzt wurde nach dem zerstören.
Zitat von
Sidorion:
@DGL-Luke: darum ist Assigned(MyObj) in dem Falle nach wie vor true, das ist ja das Problem. Wenn nicht, würd ich die Methode ja nicht mehr rufen.
Das ist das was er mit "
wenn der Zeiger anschtändig nil gesetzt wurde" meinte.
Ich habe mir angewöhnt Objekte immer wie folgt freizugeben:
Delphi-Quellcode:
...
myObject.Free;
myObject := nil;
...
Dann funktioniert auch der oben angegebene Code wieder. (asigned prüft auf nil)
Free prüft auch auf nil, deshalb ist folgender Code fehlerhaft:
Delphi-Quellcode:
...
myObject := TmyObject.Create;
...
myObject.Free;
myObject.Free;
// hier gibts Exception !!!
...
Folgender code läuft hingegen fehlerfrei:
Delphi-Quellcode:
...
myObject := TmyObject.Create;
...
myObject.Free;
myObject := nil;
myObject.Free; // kein Problem, da destroy nur aufgerufen wird, wenn <> nil
myObject := nil; // diese 2. nil-Zuweisung ist überflüssig,
// aber ich kombiniere immer Free mit nil Zuweisung ;-)
...
Wenn Dir das zuviel Tipparbeit ist, kannst Du auch FreeAndNil verwenden.
Delphi-Quellcode:
...
FreeAndNil(myObject);
...
(ist in SysUtils definiert)
Delphi-Quellcode:
{ *********************************************************************** }
{ }
{ Delphi / Kylix Cross-Platform Runtime Library }
{ System Utilities Unit }
{ }
{ Copyright (c) 1995-2002 Borland Softwrare Corporation }
{ }
{ *********************************************************************** }
unit SysUtils;
...
procedure FreeAndNil(
var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) :=
nil;
Temp.Free;
end;
...