! ABOUT FREE ,这里有段代码,请高手们赐教!(关于FREE过程。)(100分)

D

dyydyy

Unregistered / Unconfirmed
GUEST, unregistred user!
##特提! ABOUT FREE ,这里有段代码,请高手们赐教!(关于FREE过程。)

请大家不要胡扯,好吗?

在RREE过程中我遇到如下的问题:
(1)
*******************************************************************************
interface
...
var form1:tform1;
strstr:tstrings;//strstr在这里定义。

implementation

...

procedure tform1.button1click(sender:tobject);

begin

strstr.free;//strstr 在之前不曾被初始化(没能调用strstr:=tstringlist.create)

end;
*******************************************************************************
以上一段代码不会出现错误。
*******************************************************************************

(2)
*******************************************************************************
interface
...
var form1:tform1;


implementation

...

procedure tform1.button1click(sender:tobject);
var strstr:tstrings;//strstr在这里定义。
begin

strstr.free;//strstr 在之前不曾被初始化(没能调用strstr:=tstringlist.create)

end;
*******************************************************************************
以上一段代码会导致错误。
*******************************************************************************

(3)
*******************************************************************************
interface
...
var form1:tform1;
var strstr:tstrings;//strstr在这里定义。<------------------------
&amp;brvbar;
implementation &amp;brvbar;

... &amp;brvbar;
&amp;brvbar;
procedure tform1.button1click(sender:tobject)
&amp;brvbar;
var strstr:tstrings;//strstr在这里定义。<------------------------
begin

strstr.free;//strstr 在之前不曾被初始化(没能调用strstr:=tstringlist.create)
strstr.free;//strstr 再次被free,均会产生错误!the help say:free won't result an error even the object is nil
end;
*******************************************************************************
以上一段代码会导致错误。
strstr 再次被free,均会产生错误!the helper say:free won't result an error even the object is nil,
但是,在第二个free之前,让strstr:=nil,不会有错误!
*******************************************************************************

__请问?________________________________________________________________________
&amp;brvbar
&amp;brvbar;
&amp;brvbar
1.上面错误是如何产生的,为什么会产生错误? &amp;brvbar;
&amp;brvbar
2.SET NIL 能够释放内存吗? 和free有什么区别?有没有别的办法?或者二选一?&amp;brvbar;
&amp;brvbar
3.'{$R *.DFM}'是什么?这些等等的含义是什么?用'{...}'做注释不会有干扰吧? &amp;brvbar;
&amp;brvbar;_______________________________________________________________________________&amp;brvbar;
 
P

panyongze

Unregistered / Unconfirmed
GUEST, unregistred user!
你想干吗?
 
D

dyydyy

Unregistered / Unconfirmed
GUEST, unregistred user!
我在编写一个程序时,有一个object运行时(可能被free了,也可能没有,也可能根本没有被create.)
但我不管怎么样,最后是应该在被create情况下,要释放掉。
没有create时会产生free错误的。
 
S

sundart

Unregistered / Unconfirmed
GUEST, unregistred user!
你既然没有创建它干吗要释放它?
象(1)种情况, 系统会自动初始化StrStr。反之定义在过程中的变量则不会。
要不这样:
if assigned(strstr) then
strstr.free;

 
D

dyydyy

Unregistered / Unconfirmed
GUEST, unregistred user!
if assigned(strstr) then
strstr.free;
我试过 ,没用。
 
W

wlmmlw

Unregistered / Unconfirmed
GUEST, unregistred user!
Free(不是特指Free函数)涉及到很多东西,对不不同的Object,Free进行的操作有所区别。
 
D

dyydyy

Unregistered / Unconfirmed
GUEST, unregistred user!
http://www.csdn.net/expert/topic/161/161377.shtm中网友阿贵的回答有深度,你认为呢?
 

冰火

Unregistered / Unconfirmed
GUEST, unregistred user!
Delphi的帮助中对Free说的不多,大意是Free被调用时,系统会判断该对象是否为空,
若不为空则调用其destructor方法,你看看TObject的Free函数的实现就明白了,
是混合编译的代码。

但是连续调用Free是可能出错的,这一点Delphi的帮助没有说,或者说说错了。
Free并不保证把自己变成nil,而且我遇见过也不把自己的子对象置为nil的情况。
wlmmlw说的对,不同的Object,其Free进行的操作是有区别的,看看TComponent和
TWinControl的Free代码就能明白。

(1)和(2) Sundart已经说清楚了,我就不多说了。
(3)的代码里,你实际上是重复了(2)的代码,因为同名的不同作用范围的变量在使用时
总是优先采用作用范围最小的(条件是在当前执行的空间里有效)。如果你在两个Free
之间加上strstr := nil;,则实际上你是创建了这个实例,只是其指针为空罢了。这时
按照Delphi帮助的说法,你第二次调用Free的这条语句当然不会产生错误了(至少就
你代码的实际环境而言,我前面已经说过,连续Free有可能产生错误的)

至于你问的那几个问题,1上面已经是答案了
2吗,我的意见是,Delphi定义的数据类型的类,使用Set nil和Free似乎区别不大,
但是复杂的类或者自己定义的类,最好用Free,比较正规和保险一些。这个问题可以
另开个帖子讨论一下了。
至于3.你没发现{}里是个DFM么?
$R表示后面是个资源文件,*.DFM表示与该Unit(就是写了这句话的Unit)同名的DFM
被当做资源连接进来。

大致如此
 
B

bbkxjy

Unregistered / Unconfirmed
GUEST, unregistred user!
首先要明确 Delphi 中对象变量实际是指向对象实例的指针,即对对象的引用。
(1) strstr 是全局变量,位于静态数据区,程序启动时自动初始化为 0,即 nil, 而 Free
先检查 strstr 是否为 nil, 是则不作任何操作,否则调用 destroy 析构。这里 strstr
为 nil, 因此不会出错。
(2) button1click 中 strstr 是局部变量,在栈中分配空间,不会自动初始化为 0,因此
进入方法时它实际的值是不定也无意义的,如果它的值不为 0(nil),则 Free 会把这个
值作为一个指向 TStrings 对象实例的指针调用这个实际不存在的对象的 Destroy 方法,
因此会出错。
(3) strstr 仍是局部变量,情况与(2)一样的。Free 并不会把对象变量重置为 nil,所以
第二次调用 Free 仍出错。插入一个 strstr := nil
则同上面所说,第二个 Free 不会
调用 Destroy 就不会出错了。
对于 {$R *.DFM} 同意冰火,{$XXXXX} 的格式都是指示编译器作一些特殊操作的指令或开关。
在 Help 索引查找中输入 "complier directives" 可以查到这些命令的完整列表。
 

晨晨

Unregistered / Unconfirmed
GUEST, unregistred user!
我觉得可以给bbkxjy加分了。free会判断对象是不是空,不是就会destroy ,但是不初始化
就可能不是为0,也就是说会调用destroy,当然就有错了!
 
C

creation-zy

Unregistered / Unconfirmed
GUEST, unregistred user!
在释放对象的时候用FreeAndNil(一般的,在Free或Destory对象之后系统不会自动把它置为Nil(参见bbkxjy
的发言)),这样,再次Free的时候就绝对不会出错。
 

至尊王

Unregistered / Unconfirmed
GUEST, unregistred user!
使用:
if strstr<>nil then
strstr.free;
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
I
回复
0
查看
598
import
I
I
回复
0
查看
515
import
I
顶部