VirtualTreeView内存泄漏与对象

时间:2015-03-06 14:38:15

标签: delphi memory-leaks virtualtreeview

我在这个Cosmin Prund中使用了post提供的代码,因为它符合我的需要但是我经常会遇到内存泄漏而且我无法弄清楚如何释放节点&# 39;反过来包含TNode的{​​{1}}对象最后也可以包含TObjectList,其中也包含TNode等等...它是某种递归我虽然,

据我所知,根据此link释放TObjectList中的节点需要验证节点并在VirtualTreeView事件中最终确定此代码返回无效指针操作和课程内存泄漏报告:

OnFreeNode

这是重现内存泄漏的完整示例

procedure TfrmFichePermission.VSTFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
  AObject:TObject;
  ANode: TNode;
begin
  AObject := TObject(VST.GetNodeData(Node)^);
  ANode := TNode(AObject);
  ANode.Free;
end;

内存泄漏报告:

enter image description here

1 个答案:

答案 0 :(得分:4)

Cosmin的代码并不打算树视图节点拥有TNode个对象。我认为在他的帖子中你打算抓住Root对象并在树被破坏后将其销毁。

在Cosmin的代码中,TNode对象归包含它们的对象列表所有。直到根节点的方式,根节点由创建它的任何东西拥有。你也可以这样做。您必须记住根对象,并在树视图节点被销毁时停止销毁TNode对象。

如果您希望树视图拥有TNode个对象,那么您可以这样做。但你需要明确所有权。您目前没有树视图拥有对象的对象列表。如果树视图将成为所有者,则需要在对象列表中将OwnsObjects设置为False。或者甚至更好地切换到TList<TNode>

因此,总而言之,您的现有代码为每个TNode对象提供了两个所有者。树视图节点和拥有对象列表。对象需要只有一个所有者。您需要在两个选项之间进行选择。