關於TStrings.Objects釋放的問題!(200分)

  • 主题发起人 vincent+
  • 开始时间
倒,没明白我的意思?白写了。。。

procedure FreeList(List: TStrings)
var
I: Integer;
begin
for I := 0 to List.Count - 1 do
if Assigned(List.Objects) then
List.Objects.Free;
List.Clear;
end;

procedure TfrmEdit.Init;
var
UserInfo :TUserInfo;
begin
FreeList(FUserInfoList);
//goon init...
...
end;

procedure TfrmEdit.FormDestroy(Sender: TObject);
begin
FreeList(FUserInfoList);
FUserInfoList.Free;
end;
 

谢谢,明白。
这样做总感觉怪怪的,调用间还这么麻烦
--------------------------------
继承一个类好了
type
TVicStringList = Class(TStringList)
public
procedure Clear
override;
procedure Delete(Index: Integer)
override;
procedure Free

end;

{ 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;

--------------------------------
现在想知道的是关于李维使用的那个问题!
谢谢!
 
没看过他的例子,你想问什么?
如果李'那例子没free对象,就该打他PP,但有些对象是引用的,有些对象是用Parent和Owner
的,那则不需要free,它的Owner/Parent会处理。。。

不过一句话,类里面只是提供某个功能,像TList,它保存一个指针,天知道那个指针是谁
new的,需不需要free,所以它是不会free它的,所以你最好在TList外面作free那些指针,
类的功能相对独立点吧。。。
 
作了一个小测试,如下
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,其可以自动释放么?
 
请看此属性 TObjectList.OwnsObjects
表示,对象是否为TObjectList所拥有,如果是,那么TObjectList会自动负责
这些对象的释放工作,如果不是,则需要自己释放
TComponentList 继承自TObjectList, 所以也有这个属性

看一下帮助里怎么说?
Allows TObjectList to free objects when they are deleted from the list or the list is destroyed.

property OwnsObjects: Boolean;

Description
OwnsObjects allows TObjectList to control the memory of its objects.
If OwnsObjects is True (the default),

1.calling Delete or Remove frees the deleted object in addition to removing it
from the list.
2.calling Clear frees all the objects in the list in addition to emptying
the list.
3.calling the destructor frees all the objects in the list in addition
to destroying the TObjectList itself.
4.assigning a new value to an index in Items frees the object
that previously occupied that position in the list.

Even if OwnsObjects is True, the Extract method can be used to remove
objects from the list without freeing them.
 
谢谢上面几位!
 
多人接受答案了。
 

Similar threads

顶部