作了一个小测试,如下
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Contnrs;
type
TVicStringList = Class(TStringList)
public
procedure Clear
override;
procedure Delete(Index: Integer)
override;
procedure Free
end;
type
TTest = Class
Name :String;
Age :integer;
end;
type
TForm1 = class(TForm)
bitAddToList: TButton;
bitAddToObjectList: TButton;
bitFreeList: TButton;
bitFreeObjectList: TButton;
procedure bitAddToListClick(Sender: TObject);
procedure bitAddToObjectListClick(Sender: TObject);
procedure bitFreeListClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure bitFreeObjectListClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
var
List :TStringList;
//List :TVicStringList;
ObjectList :TObjectList;
{$R *.DFM}
{ TVicStringList }
procedure TVicStringList.Clear;
var
i :integer;
begin
for i := 0 to Count - 1 do
begin
if Assigned(Objects) then
TObject(Objects).Free;
end;
inherited Clear;
end;
procedure TVicStringList.Delete(Index: Integer);
begin
if (Index >= 0) and (Index <= Count) then
if Assigned(Objects[Index]) then
TObject(Objects[Index]).Free;
inherited Delete(Index);
end;
procedure TVicStringList.Free;
var
i :integer;
begin
for i := 0 to Count - 1 do
begin
if Assigned(Objects) then
TObject(Objects).Free;
end;
inherited Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
List := TVicStringList.Create;
ObjectList := TObjectList.Create;
end;
// add to list
procedure TForm1.bitAddToListClick(Sender: TObject);
var
T : TTest;
i :integer;
begin
for i :=0 to 100000 do
begin
T := TTest.Create;
T.Name := 'A';
T.Age := 10;
List.AddObject('a',T);
end;
end;
//Add to ObjectList
procedure TForm1.bitAddToObjectListClick(Sender: TObject);
var
T : TTest;
i :integer;
begin
for i := 0 to 100000 do
begin
T := TTest.Create;
T.Name := 'll';
T.Age := 10;
ObjectList.Add(T);
end;
end;
procedure TForm1.bitFreeListClick(Sender: TObject);
begin
List.Free;
end;
procedure TForm1.bitFreeObjectListClick(Sender: TObject);
begin
ObjectList.Clear;
ObjectList.Free;
end;
end.
工作管理员内存使用显示:
当建立 project1.exe 占用内存:1872K
1)当 List :TStringList时, project1.exe 占用内存:
bitAddToListClick 7364K
bitFreeListClick 6616K
2)当 List :TVicStringList时,
bitAddToListClick 7376K
bitFreeListClick 1936K
3)使用TObjectList
bitAddToObjectListClick 5372K
bitFreeObjectListClick 1876K
我的理解:
1)TStringList是不能自动帮你释放Objects[n]的
2)自己处理过后可以
3)TObjectList象可以自动帮你释放这些Objects[n] (不调用TObjectList.Clear 结果也一样!
TObjectList继承于TList,其可以自动释放么?