以我的理解能力,FreeAndNil其实就两句话
procedure FreeAndNil(var Obj:TObject);
begin
Obj.Free;
Obj:=Nil;
end;
但是我看了VCL的源码,发现完全不是这样的,代码如下
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
为什么要使用一个中间变量呢?为什么要先nil再Free呢?类型转换是必须的吗?为什么参数不直接声明为TObject类型呢?
procedure FreeAndNil(var Obj:TObject);
begin
Obj.Free;
Obj:=Nil;
end;
但是我看了VCL的源码,发现完全不是这样的,代码如下
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
为什么要使用一个中间变量呢?为什么要先nil再Free呢?类型转换是必须的吗?为什么参数不直接声明为TObject类型呢?
解决方案 »
- 有关线程执行循环事件操作时的难题
- 两上ACCESS库之间互导数据
- 关于汉字的首字母查询, 所有汉字库的问题(包括一,二级汉子库),帮个忙,好人有好报啊!给20分
- 求助!!关于checkbox控件的使用!!
- 各位大哥,我的DBGRID中的记录要修改,保存,只是在原有的记录上修改保存,怎么实现
- 请帮忙看看下面的程序?为什么报表中全部行的数据都一样,应怎么改?
- Delphi7在windows server2008系统下通过代理调用webService的问题
- 怎样实现扫描检测整个局域网中机子的开机状态(是否开机)??速度...
- 我的儿子两岁啦,送点什么给他作生日礼物呢,大家出点主意,要益智、健康的
- 在DELPHI5中如何取文体框中的某个或任意一个字符。请各位高手指点,多谢!!
- DLL的参数调用问题
- 发送数组!!!帮忙解决
调用的时候就不用freeandnil(Tobject(var))了
Borland这样写我个人认为是Pointer(Obj):=nil;//绝对不会出现错误或抛出异常但Temp.free可能会.所以如果先free再nil那么就要进行异常处理,这样这简单的小function是没必要也不够清晰.
Rain的解释还不太懂,先nil再free就不异常了?该异常的你调用Temp.free还是异常的啊
至于,参数类型为什么不直接写为TObject,可能是考虑对象有时赋给其它类型的指针甚至一个整数类型
=============================================================================================
为什么要将简单问题项复杂呢?and本就是并列关系,FreeAndNil和NilAndFree有区别吗?如果Obj是合法对象,固然是FreeAndNil;而当Obj为非法对象时,Free已没有意义,直接置为Nil,FreeAndNil的双重目不也同样达到了吗!所以,我认为Delphi的源码就是考虑这一点才这么写的,这很好理解,和“接口引用计数什么的”应该毫无关系。当然,你认为我解释不对,要往复杂处想,我也无话可说,毕竟不伤谁的皮肉!哈哈!!!
free出错的机会比置空要大,
因此先置空,再Free,如果不用临时变量的话
置空以后,就没法Free了至于用无类型参数而不用TObject,
应该考虑的是即使传入其它类型比如指针、数值时,
至少保证能置为nil