动态创建窗体与内存不能完全释放问题(30分)

  • 主题发起人 主题发起人 rsina
  • 开始时间 开始时间
R

rsina

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟我最近在看d5开发人员指南,其中有一个关于模式窗体的部分很是奇怪。我的确是实现了书中的代码和理解了他想说明什么,不过我在试验的时候发现了一个很奇怪的问题。

首先建立两个窗体,其中form2在dpr文件中,注释掉创建的那句代码,在CLOSE事件中设置
Action := caFree
在 FormDestroy 事件中设置 form2 := nil;和 form2.free;

form1上放一个按钮,事件如下:
procedure TForm1.Button1Click(Sender: TObject);
begin
unit2.Form2 := TForm2.Create(self);
unit2.Form2.Height := 50;
unit2.Form2.Width := 50;
unit2.Form2.Top := 50;
unit2.Form2.Left := 50;
unit2.Form2.Show;
end;

运行起来一切正常,并且打开的窗体内存被释放掉了。但是仔细看发现第一次打开form2窗体的时候,内存增加了原有值+60K左右,之后关闭form2窗体增加的并不减少,你再次打开form2窗体,内存又增加原有值+60K+12K,但是你关闭的时候内存会恢复到原有值+60K,也就是说第一次打开的那60k不会释放。这是为什么啊?

后来请教了香帅大哥,他指点说用消息的方法好些,于是我在form2关闭的时候发一个消息给form1,由form1来freeandnil form2,但是结果还是一样。

奇怪了,难道delphi没有完全释放窗体内存啊?

呵呵,小弟问题多,分又少,见谅。
 
procedure TForm1.Button1Click(Sender: TObject);
begin
unit2.Form2 := TForm2.Create(self);
unit2.Form2.Height := 50;
unit2.Form2.Width := 50;
unit2.Form2.Top := 50;
unit2.Form2.Left := 50;
unit2.Form2.Show;
end;

观察一下这段代码:
1.Form2创建的Owner是Form1,表示如果Form1释放的话,会自动释放Form2
2.Form2并没有调用Free,所以在Form1关闭之前,没有释放Form2。内存泄漏啊。
3.你可以在窗体Form关闭的时候,强制Free。这种情况对Show的非模态窗体比较常用
procedure TForm1.FormClose(Sender: TObject
var Action: TCloseAction);
begin
Action := caFree;
end;
 
xiammy兄,我已经在close中设置了你说的属性,也在free了form2,但是依然不能完全释放,你说的form2属于form1的确是这样,但是我认为,form1不使用form2难道不能完全释放form2使用的内存么?
 
procedure TForm1.Button1Click(Sender: TObject);
begin
unit2.Form2 := TForm2.Create(self);
unit2.Form2.Height := 50;
unit2.Form2.Width := 50;
unit2.Form2.Top := 50;
unit2.Form2.Left := 50;
[red]unit2.Form2.Showmodal;
unit2.form2 := nil;
unit2.form2.free;[/red]
end;
 
推荐
DESTROY;
nil;
。free 呵呵 3个一起用
 
后退
顶部