关于FreeAndNil的实现问题(100分)

  • 主题发起人 主题发起人 ymail
  • 开始时间 开始时间
Y

ymail

Unregistered / Unconfirmed
GUEST, unregistred user!
在我读SysUtils源码时,发现FreeAndNil实现如下:
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
为什么不能简化成:
procedure FreeAndNil(var Obj);
begin
TObject(Obj).Free;
Pointer(Obj) := nil;
end;
我想来想去,就只有Free和Nil的顺序两者不同,前者是先置空。
大家怎么看?
 
TObject(Obj).Free

Pointer(Obj) := nil
//obj都Free了,还能引用吗?
 
按Delphi的约定,obj只是一个Reference,Free掉的是它指向的对象,
这样它就成了个空悬的指针,要不然这个函数还有什么意义。。。
 
对真正低层的东西我不是很懂,我只能这样给你解释:

procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj)
//先将对象赋予局部变量Temp;
Pointer(Obj) := nil
//然后将obj悬空,
Temp.Free
//Free掉对象
end
//退出该方法时,Temp被释放

其实意思与你想应该是一样的,重点是当TObject(Obj).Free
后,就不能Pointer(obj)了。。。
:)
 
我想可能是程序员的自我主观而已,
并没有可推敲的道理,

但是两种处理方法是有区别的,
对于第一种,则能保证对象指针被置空,
但对于第二种,如果引用的对象已经不存在,那么会出现异常,
或者说一个对象被销毁时发出异常,那么对象指针则仍然是原来的值
同时指针也不能被置空了,

至于上面几位的说法,像在开玩笑
 
同意楼上所说!FreeAndNil是肯定可以把指针悬空,TObject(Obj).Free

Pointer(Obj) := nil
在引发异常的情况下便不能完成指针悬空!
 
让我来总结一下,大家看对不对。
FreeAndNil是用于将不再使用的对象释放并将变量置空,这样在下次误用时必将暴露出错误
,一个空悬的指针可能引起古怪的程序行为导致调试除错困难,而一个空指针引起的问题就
确定的多。
第一种实现可以保证不再使用的对象指针置空,所以即使函数中发生异常,也可以带来更加
安全的结果。
这是一种防错性的程序设计技术的运用。[:)]
 
多人接受答案了。
 
后退
顶部