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

标签 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', '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/

相关文章:

java - 如何向对象添加 ImageIcon?

python - 在Python中查找0-100之间的值范围内的索引

c++ - std::list 是否指向同一内存?

delphi - 在 Delphi 应用程序中查看 Autocad 绘图

web-services - Indy IdHTTPServer GET 响应参数随机丢失

javascript - 实例化多个对象

javascript - 查找 Rangy 标记 ID

python - 尝试通过计算列表列表中的出现次数来添加到字典值中(Python)

java - 实现接口(interface)的类列表

delphi - 有没有Delphi+Firebird从头开始的文档(服务器端)