delphi - 替换 TObjectList 中的对象并释放它(Delphi7)

标签 delphi tobjectlist

我有一个包含很少元素的 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;

此时,前一项是在之前的循环中添加的非零引用。该对象就这样被销毁了。

TObj.Items[1]:= LPoint;

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

最重要的是您的代码过于复杂。您可以更换

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

TObj.Items[1]:= LPoint;

该类将销毁当前存储在 TObj.Items[1] 中的对象,然后用 LPoint 替换它。正如你所愿。

关于delphi - 替换 TObjectList 中的对象并释放它(Delphi7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42293190/

相关文章:

delphi - 六角格计算

c# - 将结构数组从 C# 传递到 Delphi

Delphi 添加项目到 ComboBox 速度

delphi - 如何在 Delphi 中用稳定排序替换 StringList.Sort?

delphi - 对象列表未检索数据

delphi - 使用大的 TObjectList 并释放未使用的部分

delphi - 调试时如何检查非泛型TObjectList的内容?

arrays - 如何在没有 ShareMem 单元的情况下将动态字符串数组传递给 dll 库(dll 和用 d7 编写的客户端)?

德尔福故障: Sorting a Tobjectlist<>

Delphi发送TObjectList之类的var参数