gpt4 book ai didi

delphi - 分配给多个StringList的对象的可用内存

转载 作者:行者123 更新时间:2023-12-03 19:39:49 25 4
gpt4 key购买 nike

我有一个分配给多个TStringList对象的对象。

释放第一个TStringList的内存可以正常工作。
但是,当我为第二个TStringList调用Object.Free时,将导致访问冲突。

这就是将对象分配给2 TStringList的方式

     SL1.AddObject(S, Person);
if (Sl2<> nil) and (Var1 <> '')
then Sl2.AddObject(Var1,TObject(Person));


这就是释放内存的方式。

SL1

方法:发布SL1

For J := SL1.Count - 1 downto 0  do
begin
if (SL1.Objects[J]) <> nil then
begin
PersonObj:= TPerson(SL1.Objects[J]);
PersonObj.Free;
SL1.Objects[J] := nil;
end;
end;


SL2

方法:发布SL2

  for I := 0 to SL2.Count-1 do
if SL2.Objects[I] <> nil then
begin
PersonObj := TPerson(SL2.Objects[I]);
PersonObj .Free;
SL2.Objects[I] := nil;
end;
SL2.Clear;


在这里,当在方法ReleaseSL2中执行PersonObj.Free时,将导致访问冲突

除了重组代码之外,还有什么方法可以避免这种访问冲突?

注意:还有更多对象分配给SL1和SL2,并且2个 TStringList对象不相同

最佳答案

为了确保您不会尝试两次free对象,可以使用如下所示的内容:

For J := SL1.Count - 1 downto 0  do
begin
if (SL1.Objects[J]) <> nil then
begin
PersonObj:= TPerson(SL1.Objects[J]);

// Make sure this object is not kept in SL2 any more:
SL2.remove(PersonObj);

PersonObj.Free;
SL1.Objects[J] := nil;
end;
end;



for I := 0 to SL2.Count-1 do
if SL2.Objects[I] <> nil then
begin
PersonObj := TPerson(SL2.Objects[I]);
PersonObj .Free;

// Make sure this object is not kept in SL1 any more:
SL1.remove(PersonObj);

SL2.Objects[I] := nil;
end;
SL2.Clear;

一个注意事项:如果该列表尚未清除,则只需要从另一个列表中删除该对象即可。

关于delphi - 分配给多个StringList的对象的可用内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32008176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com