Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Delphi-在发布之前,我必须释放TObject中的所有元素吗?_List_Delphi_Object_Memory Management - Fatal编程技术网

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先生!你的帮助对我来说总是非常重要的!好的,我会研究一下这个方法。再次感谢!