Thema: Delphi Bin ich schon zerstört?

Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#20

Re: Bin ich schon zerstört?

  Alt 9. Nov 2005, 13:40
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;
...
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat