发信人: 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毫秒