发信人: hyy (活着便精彩), 信区: BorlandDev
标  题: 大富翁上关于FreeAndNil的讨论
发信站: BBS 哈工大紫丁香站 (Thu Oct 28 13:35:49 2004)

在Delphi里FreeAndNil的实现如下:
procedure FreeAndNil(var Obj);
var
  Temp: TObject;
begin
  Temp := TObject(Obj);
  Pointer(Obj) := nil;
  Temp.Free;
end;
疑问:
为什么,执行的顺序是先:=nil之后Free;而不是如方法名,先Free之后:=nil。
Delphi这样做法有什么特别的作用?  


来自:xyl106, 时间:2004-7-15 14:46:37, ID:2713641
 这里用了temp,所以顺序好象无所谓  


来自:shangrand, 时间:2004-7-15 14:50:17, ID:2713649
首先使指针为空,再释放实体内存。  


来自:lichengbin, 时间:2004-7-15 14:52:33, ID:2713655
对于单线程的情况,顺序没有关系。
对于多线程的情况,顺序必须这样的。防止多线程程序中,一个线程中Obj先被Free
而Obj没有赋为nil前另一个线程可能要Free它哦。我估计的。呵呵  


来自:寻路, 时间:2004-7-15 14:55:18, ID:2713663
这个没有什么区别,TEMP指向OBJ指向的对象,而OBJ也指向这个对象,等于有两个指针指向同
一个对象,一个为NIL,还有一个:)
在Pointer(Obj) := nil;操作的时候,OBJ指向的对象并没有释放.直到:Temp.Free;  


来自:zhangshunzhong, 时间:2004-7-15 14:55:50, ID:2713665
应该没什么大的区别  


来自:寻路, 时间:2004-7-15 14:56:43, ID:2713669
lichengbin说得有道理,我没有考虑到!  


来自:ildg, 时间:2004-7-15 15:04:39, ID:2713691
我也同意lichengbin说的。  


来自:781028, 时间:2004-7-15 15:58:22, ID:2713693
1.Free 是将创建的对象释放,在内存中消失。
2.Pointer(Obj) := nil; 给对象赋一个值,还在内存中.
3.先Free之后:=nil;对象已经不存在
4.和多线程没有关系.  


来自:寻路, 时间:2004-7-15 15:17:51, ID:2713735
不会吧,比我说得还没有道理![:D]  


来自:lichengbin, 时间:2004-7-15 15:20:59, ID:2713743
To 781028:
A := TStringList.Create;
A.Free;
A := nil;
这样会出错吗?我还是第一次听说!呵呵  


来自:alter, 时间:2004-7-15 15:47:40, ID:2713817
其他地方调用时,会先检查这个对象是否不为空。 先置为空,再释放,可避免共享访问错
误。  


来自:781028, 时间:2004-7-15 15:56:44, ID:2713847
to 寻路.你的说法,肯定是错误的.
to lichengbin 
  A := nil;会执行吗?
  A := nil;不会报错的.
但是和多线程绝对没有关系.
  


来自:idofindit, 时间:2004-7-15 16:03:06, ID:2713866
lichengbin,说地有道理,但是我觉得和多线程的FREE没有关系,因为由代码可知,释放时
并不判断是否为nil,所以只要被释放两次,无论哪个顺序都是要出问题的。所以我个人觉
得和多线程的访问有关,以防止另一个线程访问时刚判断时不为nil,  而用时已经被释放
掉了。。  


来自:wwr74, 时间:2004-7-15 16:04:44, ID:2713871
lichengbin说得有道理,先把这个指针清空了,省得其他地方又去做什么操作了,然后再
free内存。
呵呵,我也是猜的。  


来自:SuperYoyoNC, 时间:2004-7-15 16:31:57, ID:2713944
单线程应该无所谓的……  


来自:zjan521, 时间:2004-7-15 16:46:17, ID:2713976
多线程自然是有这个问题,不过即使不考虑多线程也应该这么写代码的,这是好的习惯.
普通的 .Free; :=nil;这是肯定的,总不可能:=nil再去Free,(这时候如果考虑多线程,呵呵
,怎么做都不行,这恐怕也是推荐使用FreeAndNil的原因之一?)
FreeAndNil的写法是从逻辑上应该这样的.你首先应该把需要Free的对象变成你的内部对象
,把外部的引用清空,然后才操作.  

--
     ________     ________
   /|        \   /        |\
  /||         \ /         ||\
  |||          |          |||
  ||| 向你推荐 | Delphi   |||
  |||          |          |||


※ 来源:·哈工大紫丁香 http://bbs.hit.edu.cn·[FROM: 202.118.235.183]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.083毫秒