form1 form2 form3 内存溢出的问题(50分)

  • 主题发起人 主题发起人 tl_lyq
  • 开始时间 开始时间
T

tl_lyq

Unregistered / Unconfirmed
GUEST, unregistred user!
form1 form2 form3 内存溢出的问题
form1 添加按钮 button1 代码为
procedure TForm1.Button1Click(Sender: TObject);
begin
try form2:=tform2.create(nil);
form2.showmodal;
finally form2.free;
end;
end;

form2 添加button1 代码为
procedure TForm2.Button1Click(Sender: TObject);
begin
if not assigned(form3) then
form3:=tform3.create(form2);
form3.showmodal;
end;

运行程序,点form1的button1,弹出form2,点form2的button1,弹出form3.关闭form3,关闭form2
再点form1的button1,弹出form2,点form2的button,提示内存溢出
为什么?
 
跟这里的代码没有关系,内存溢出是你其他代码的问题,
需要指出的是
if not assigned(form3) then
---> ///line1
form3:=tform3.create(form2);
--》 //line2
form3.showmodal;
关闭form2的时候,form3将被释放(line2),这个时候没有置form3为nil,因此按form2上button1的时候将不断创建form3
 
没有其他代码,就这些,随便测试的.如果设置为nil form3:=tform3.create(nil);
那关闭form2的时候,因为form3也不需要了,就需要手动free了,现在是想form2关闭,所有其下创建的子窗体也关闭,释放内存.
 
看來也是一個入門者,看不過去了,
form1 添加按钮 button1 代码为
procedure TForm1.Button1Click(Sender: TObject);
begin
try form2:=tform2.create(nil);
form2.showmodal;
finally form2.free;
end;
end;

form2 添加button1 代码为
procedure TForm2.Button1Click(Sender: TObject);
begin
if not assigned(form3) then
[red]form3:=tform3.create(form2);[/red] form3.showmodal;
改為 form3:=tform3.create(nil)
end;
 
改為 form3:=tform3.create(nil)
我知道这样可以,我想知道的是为什么时候这样会报错.
if not assigned(form3) then
form3:=tform3.create(form2);
form3.showmodal;
 
来自:tl_lyq, 时间:2008-12-11 17:32:11, ID:3934968
改為 form3:=tform3.create(nil)
我知道这样可以,我想知道的是为什么时候这样会报错.
if not assigned(form3) then
form3:=tform3.create(form2);
form3.showmodal;

//FORM3 close时如果没有加Form3 := nil;
这一句 时 assigned(form3) 判断FORM3已经存在了,实际上他不存在。因为FORM3的指针没有清空。
所以一般不要只写FREE ,而要写FREEANDNIL
 
后退
顶部