我有一个带有少量元素的TObjectList。我必须在同一项目中将其中之一替换为新的(不更改计数)。我执行以下操作:

procedure TForm1.Button1Click(Sender: TObject);
var
  TObj: TObjectList;
  LPoint: TPPoint;
  i: integer;
begin
  TObj:= TObjectList.Create;
  try

    for i:= 0 to 3 do
    begin
        LPoint:= TPPoint.Create(i, i+ 1);
      TObj.Add(LPoint);
    end;

    LPoint:= TPPoint.Create(21, 22);
    TObj.Items[1]:= nil;
    TObj.Items[1]:= LPoint;

    for i:= 0 to 3 do
    begin
        ShowMessage(IntToStr(TPPoint(TObj.Items[i]).X));
    end;

  finally
    TObj.Free;
  end;
end;


我的问题是:如何释放内存中被替换的元素?帮助说:“如果重新分配索引,则对象将被释放”。命令TObj.Items[1]:= nil;是否足够?

在此先感谢您提供任何信息。

最佳答案

TObj.Items[1]:= nil;
TObj.Items[1]:= LPoint;


在这里,您执行两个作业,因此该类尝试释放两个项目。

TObj.Items[1]:= nil;


此时,上一项是在您先前的循环中添加的非null引用。该物体因此被破坏。

TObj.Items[1]:= LPoint;


当执行此行时,TObj.Items[1] = nil,因此在Free上调用nil方法。没发生什么事。

底线是您的代码过于复杂。您可以更换

TObj.Items[1]:= nil;
TObj.Items[1]:= LPoint;




TObj.Items[1]:= LPoint;


该类将销毁当前存储在TObj.Items[1]中的对象,然后将其替换为LPoint。随你便。

10-07 15:25