List Delphi-在发布之前,我必须释放TObject中的所有元素吗?
关于此代码,请:List Delphi-在发布之前,我必须释放TObject中的所有元素吗?,list,delphi,object,memory-management,List,Delphi,Object,Memory Management,关于此代码,请: type TClient = class(TObject) public Host: String; Queue: TIdThreadSafeStringList; end; var Clients: TThreadList; procedure TMain.FormCreate(Sender: TObject); const Hosts: Array[0..4] of String = ( 'HOST1', 'HOST2', '
type
TClient = class(TObject)
public
Host: String;
Queue: TIdThreadSafeStringList;
end;
var
Clients: TThreadList;
procedure TMain.FormCreate(Sender: TObject);
const
Hosts: Array[0..4] of String = (
'HOST1', 'HOST2', 'HOST3', 'HOST4, 'HOST5'
);
var
I: Integer;
List: TList;
Client: TClient;
begin
Clients := TThreadList.Create;
Clients.Duplicates := dupAccept;
for I := Low(Hosts) to High(Hosts) do
begin
Client := TClient.Create;
Client.Host := Hosts[I];
Client.Queue := TIdThreadSafeStringList.Create;
Clients.Add(Client);
Client := nil;
end;
end;
我想知道释放内存的正确方法是:
procedure TMain.FormDestroy(Sender: TObject);
var
I: Integer;
List: TList;
begin
List := Clients.LockList;
try
for I := 0 to List.Count - 1 do
TClient(List[I]).Free;
finally
Clients.UnlockList;
Clients.Free;
end;
end;
或者像这样:
procedure TMain.FormDestroy(Sender: TObject);
var
I: Integer;
List: TList;
begin
List := Clients.LockList;
try
for I := 0 to List.Count - 1 do
begin
TClient(List[I]).Queue.Free;
TClient(List[I]).Free;
end;
finally
Clients.UnlockList;
Clients.Free;
end;
end;
换句话说,我想知道当我释放一个对象(TClient)时,所有元素(队列)是自动释放的,还是必须手动释放
谢谢 当客户机对象被销毁时,队列对象需要被销毁。但是,正确的方法是让客户机类负责其成员
type
TClient = class
private
FHost: String;
FQueue: TIdThreadSafeStringList;
public
constructor Create(const Host: string);
destructor Destroy; override;
end;
....
constructor TClient.Create(const Host: string);
begin
inherited Create;
FQueue := TIdThreadSafeStringList.Create;
FHost := Host;
end;
destructor TClient.Destroy;
begin
FQueue.Free;
inherited;
end;
如果这样做,则不可能实例化该类,也无法实例化其成员。按照您的方式执行,每次需要实例化类时,您都必须重复代码来实例化成员。那样很容易犯错误。更重要的是,它使代码更难阅读和维护 那么,在这个实现之后,我可以像我在问题中展示的第一个TMain.FormDestroy那样做吗?对吧?对。创建TClient时,构造函数实例化成员。破坏者摧毁了成员谢谢你Heffernan先生!你的帮助对我来说总是非常重要的!好的,我会研究一下这个方法。再次感谢!