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