内存使用和对象创建的一个问题

  • 主题发起人 主题发起人 import
  • 开始时间 开始时间
I

import

Unregistered / Unconfirmed
GUEST, unregistred user!
procedureForm1.Button1Click(Sender:TObject);
var
MyStringList:TStringList;
begin
MyStringList:=TStringList.Create;
MyStringList.Assign(ListBox1.Items);
end;
如果你回答说"没有释放TStringList的实例",这就对了。虽然这不会导致程序失败或崩溃,但它会吃掉内存,因为每次调用这个方法时,都会创建一个TStringList的实例,从而导致内存不足。尽管Win32API能够在一个进程终止时释放它所分配的内存,但在运行时出现内存不足也会导致严重问题。例如,如果一个应用程序在运行时不断地耗费越来越多的内存资源,导致操作系统不得不进行更多的磁盘交换,最终使系统不堪负担。当你在运行期间创建一个组件时,必须向组件的Create构造器传递组件的拥有关系;它被设置为新组件的Owner属性。下面一行语句表示了如何向TButton.Create()构造器传递窗口隐含的参数Self。这样使窗口成为新创建组件的拥有者:
Button:=TButton.Create(Self);
当窗口被析构时,与MyButton有关的TButton实例也会被析构。这是在VCL内部处理的。实质上,窗口再次通过Components数组属性遍历组件并析构它们。通过传递nil给组件的Create()方法,可以创建一个不具备拥有者的组件。不过,如果这样做了,编程时你需要负责组件的删除。下列代码显示了这个技术:
Button:=TButton.Create(nil);
try
....
finally
Button.Free;
end;
要使用这个技术,应当用一个try...finally块来确保出现异常时释放所分配的资源。你不应使用这个技术,除非特殊情况-不能给组件指定拥有者。
 
后退
顶部