以下是Zarko Gajic在以下文章中释放Delphi的TStrings项目中的对象的想法:
在About.com.delphi处,我正在使用Delphi 7,TStringList没有OwnsObjects。
运行以下代码将提示EaccessViolation错误。我不知道为什么以及如何
在它周围走动以释放物体。
非常感谢。
procedure TForm6.freelist(const alist: TStringList);
var
i: integer;
begin
try
for i:=0 to pred(alist.Count) do begin
if Assigned(alist.Objects[i]) then begin
alist.Objects[i].Free;
alist.objects[i]:=nil;
end;
end;
alist.Clear;
finally
alist.Free;
end;
end;
编辑:
我添加这一行alist.Objects [i]:= Pointer(0);而且没有错误。
...
for i:=0 to pred(alist.Count) do begin
if Assigned(alist.Objects[i]) then begin
alist.Objects[i]:=Pointer(0); //newly added line.
alist.Objects[i].Free;
alist.objects[i]:=nil;
end;
end;
...
//But I do not know if this is correct and
// if the efficiency will be compromised.
//This is awkward method?
最佳答案
以下原始答案回答了您提出的问题。但是,它表明您没有将对象添加到字符串列表中的注释。您只是将整数转换为Pointer
。在这种情况下,您不能在这些整数上调用Free
,这将完全解释您的错误。因此,问题中的整个代码都是免费的,完成后您只需在列表中调用Free
。
当将整数强制转换为指针并将其添加到列表时,除了用于存储指针的内存以外,没有分配的内存。那是因为整数是一种值类型。当添加真正的指针或对象时,您将添加reference
类型,并且该对象的处置涉及为对象调用Free
或为指针调用FreeMem
(或Dispose
)。
按要求回答问题的原始答案
您的原始代码是正确的,尽管有些笨拙。您遇到的问题在于填充Objects[]
的代码中。由于我们看不到该代码,因此无法说出您错了。
现在,说了您的代码很笨拙,这就是我的写法:
procedure ClearList(List: TStringList);
var
i: Integer;
begin
for i := 0 to pred(List.Count) do
List.Objects[i].Free;
List.Clear;
end;
上面的一些注意事项:
调用
if Assigned(obj)
之前不需要obj.Free
测试。我在这里解释为什么不这样:Why should I not use "if Assigned()" before using or freeing things?如果您要呼叫
nil
,则将项目设置为Clear
没有什么意义。您不应在此类例程中调用
List.Free
。列表的生命周期应与清除列表的代码分开管理。对List.Free
的调用应在与构造列表的调用相同的范围内进行。或者,如果此列表是类的字段,则应从拥有类的析构函数进行对List.Free
的调用。现在,正如我在对该问题和您先前的问题的评论中已经说过的那样,使用Delphi 7字符串列表的
Objects[]
属性进行的所有生存期管理工作都非常不令人满意。泄漏物体太容易了。我建议以下替代方法:切换为使用
TObjectList
而不是TStringList
。创建列表时,将OwnsObjects
属性设置为True
。这样可以确保从列表中删除某个项目时,该项目在删除时将被销毁。您只需将清单的项目终身管理责任交给清单。请注意,这将需要您将存储在当前字符串列表代码中的string
变为对象的属性。但这始终是正确的方法,因此我认为这是一种上行而不是缺点。如果您确实希望继续使用字符串列表,则可以通过添加名为
OwnsObjects
的属性来创建自己的处理所有权的派生类。将这个问题放在列表上,让您的更高级别的代码摆脱这种担忧。在列表类的上下文中调试一次代码,然后在知道其工作原理的情况下一次又一次安全地重复使用它。关于delphi - 如何在delphi 7中释放stringlist中的对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9148659/