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