关于freeAndNil

idcsdn 2005-08-22 09:16:00
下边是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;

...全文
187 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Eastunfail 2005-08-28
  • 打赏
  • 举报
回复
参考TObject.Free中对Self进行是否是NIL的判断以及这里先设为NIL分析,应该是防止多线程同时释放同一个对象
hexenzhou 2005-08-28
  • 打赏
  • 举报
回复
有意思,看来这里还是有技巧的!现在感觉大头鸟说得有理!
idcsdn 2005-08-24
  • 打赏
  • 举报
回复
to hqhhh(枫叶) :好像不是啊,我试验过了,有值。
idcsdn 2005-08-23
  • 打赏
  • 举报
回复
的确,有道理。 但是除了对把一个已经free掉的obj再次free的时候会失败,我想不出会有其他原因会失败啊,同时freeAndnil也是不能解决这个问题啊。 赐教。
hqhhh 2005-08-23
  • 打赏
  • 举报
回复
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
//如果不用Temp,取出的obj应该是nil
//Pointer(obj)中的obj应该是nil
Pointer(Obj) := nil;
Temp.Free;
end;
sdzeng 2005-08-23
  • 打赏
  • 举报
回复
在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”
如果一件事情不成功,它起码保证了另一件事能成功

函数、过程最早的出发点就是为了实现代码重用,
用别人写好的,总比自己写省点事不是?

只有在现成的东西达不到实际要求时,才自己写,
最好别做没有任何意义的重复劳动
sdzeng 2005-08-22
  • 打赏
  • 举报
回复
我的理解是,这么写为了确保能够将Obj置为nil

procedure 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;


sdzeng 2005-08-22
  • 打赏
  • 举报
回复
我的理解是,这么写为了确保能够将Obj置为nil

procedure 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;


16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧