下边是freeAndNil的函数原型:
procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;
---------------------------------------
请问: 为什么要用Temp呢?
我觉得用下边的形式也可以啊,如下:
procedure _FreeAndNil(var Obj);
begin
  TObject(Obj).free;
  Pointer(Obj) := nil;
end;

解决方案 »

  1.   

    我的理解是,这么写为了确保能够将Obj置为nilprocedure FreeAndNil(var Obj);
    var
      Temp: TObject;
    begin
      Temp := TObject(Obj);
      Pointer(Obj) := nil;//先置Obj为nil
      Temp.Free;//不管Free是否成功,Obj都为nil
    end;如果用楼主的代码
    procedure _FreeAndNil(var Obj);
    begin
      TObject(Obj).free;
      Pointer(Obj) := nil;//如果Free不成功,是不会执行这一句的
    end;
      

  2.   

    我的理解是,这么写为了确保能够将Obj置为nilprocedure FreeAndNil(var Obj);
    var
      Temp: TObject;
    begin
      Temp := TObject(Obj);
      Pointer(Obj) := nil;//先置Obj为nil
      Temp.Free;//不管Free是否成功,Obj都为nil
    end;如果用楼主的代码
    procedure _FreeAndNil(var Obj);
    begin
      TObject(Obj).free;
      Pointer(Obj) := nil;//如果Free不成功,是不会执行这一句的
    end;
      

  3.   

    的确,有道理。 但是除了对把一个已经free掉的obj再次free的时候会失败,我想不出会有其他原因会失败啊,同时freeAndnil也是不能解决这个问题啊。 赐教。
      

  4.   

    在free的时候出问题的情况还是很多的
    比如:
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
        Memo1.Lines.SaveToFile('c:\aaa\s.txt');    
    end;
    如果c:\aaa不存在,或者s.txt被另一个程序独占打开,
    会导致TForm1.Free的时候出错能否Free成功,是析构函数的责任,
    freeandnil的责任就是两件事情:“free”和“nil”
    如果一件事情不成功,它起码保证了另一件事能成功函数、过程最早的出发点就是为了实现代码重用,
    用别人写好的,总比自己写省点事不是?只有在现成的东西达不到实际要求时,才自己写,
    最好别做没有任何意义的重复劳动
      

  5.   

    procedure FreeAndNil(var Obj);
    var
      Temp: TObject;
    begin
      Temp := TObject(Obj);
    //如果不用Temp,取出的obj应该是nil
    //Pointer(obj)中的obj应该是nil
      Pointer(Obj) := nil;
      Temp.Free;
    end;
      

  6.   

    to hqhhh(枫叶) :好像不是啊,我试验过了,有值。
      

  7.   

    参考TObject.Free中对Self进行是否是NIL的判断以及这里先设为NIL分析,应该是防止多线程同时释放同一个对象