gpt4 book ai didi

list - Delphi - 在释放自身之前我必须释放 TObject 内的所有元素吗?

转载 作者:行者123 更新时间:2023-12-03 15:46:17 25 4
gpt4 key购买 nike

请了解此代码:

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)时,所有元素(Queue)是否会自动释放,还是必须手动释放。

谢谢!

最佳答案

当客户端对象被销毁时,队列对象也需要被销毁。然而,正确的方法是让客户类负责其成员。

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;

如果您这样做,则无法实例化该类并且无法实例化其成员。按照你的方式去做,每次你需要实例化类时,你都必须重复代码来实例化成员。这样很容易犯错误。更重要的是,它使代码更难以阅读和维护。

关于list - Delphi - 在释放自身之前我必须释放 TObject 内的所有元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27585638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com