我在这个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;
内存泄漏报告:
答案 0 :(得分:4)
Cosmin的代码并不打算树视图节点拥有TNode
个对象。我认为在他的帖子中你打算抓住Root
对象并在树被破坏后将其销毁。
在Cosmin的代码中,TNode
对象归包含它们的对象列表所有。直到根节点的方式,根节点由创建它的任何东西拥有。你也可以这样做。您必须记住根对象,并在树视图节点被销毁时停止销毁TNode
对象。
如果您希望树视图拥有TNode
个对象,那么您可以这样做。但你需要明确所有权。您目前没有树视图和拥有对象的对象列表。如果树视图将成为所有者,则需要在对象列表中将OwnsObjects
设置为False
。或者甚至更好地切换到TList<TNode>
。
因此,总而言之,您的现有代码为每个TNode
对象提供了两个所有者。树视图节点和拥有对象列表。对象需要只有一个所有者。您需要在两个选项之间进行选择。