Delphi 使用VirtualTreeview和OTL的内存泄漏

Delphi 使用VirtualTreeview和OTL的内存泄漏,delphi,virtualtreeview,omnithreadlibrary,Delphi,Virtualtreeview,Omnithreadlibrary,我已经创建了一个小的多线程应用程序,我正在尝试将其转换为使用OmniThreadLibrary。我正在使用Virtualtreeview显示日志和状态/结果。Vst日志只有两列,记录只包含两个字符串字段(非常简单,记录中没有对象) 使用OTL(线程池#11)附带的演示项目,我将该项目更改为使用VirtualTreeview而不是listbox。当我从演示中“运行任务”时,没有内存泄漏,但如果我多次运行“运行任务”,将发生内存泄漏。如果我多次运行任何任务,就会发生内存泄漏。如果我根本不使用Virt

我已经创建了一个小的多线程应用程序,我正在尝试将其转换为使用OmniThreadLibrary。我正在使用Virtualtreeview显示日志和状态/结果。Vst日志只有两列,记录只包含两个字符串字段(非常简单,记录中没有对象)

使用OTL(线程池#11)附带的演示项目,我将该项目更改为使用VirtualTreeview而不是listbox。当我从演示中“运行任务”时,没有内存泄漏,但如果我多次运行“运行任务”,将发生内存泄漏。如果我多次运行任何任务,就会发生内存泄漏。如果我根本不使用VirtualTreeView,任何时候都不会发生内存泄漏。当我使用VST时,当一个任务运行不止一次时

我确实使用FreeNode事件并清除字符串,甚至尝试使用Finalize

例如:

procedure TFormMain.vstLogFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
  LogData: PTreeLogData;
begin
  LogData:=Sender.GetNodeData(Node);

  if Assigned(LogData) then begin
    LogData^.Msgtype := '';
    LogData^.Msg := '';
  end; 
  //Finalize(LogData^);

end;
当任务运行多次时,为什么会出现内存泄漏? Delphi 2010与FastMM4
最新的Virtualtreeview和OTL我不知道为什么会发生这种情况,但我知道如何找到答案:打开FastMM的FullDebuggMode。(为此,您需要从SourceForge下载FastMM完整版本。)打开在文件中提供内存泄漏报告的选项,并确保项目正在生成详细的映射文件。一旦你设置好了,FastMM将提供一个非常详细的内存泄漏报告,包括堆栈跟踪,而不仅仅是一个弹出窗口。这将有助于你缩小范围。

正如梅森所说,你的朋友在这里。您可能需要查看此CodeRage 2会话:。它主要展示了如何在Delphi中使用FastMM来防止/检测内存泄漏。是D2007,但仍然相关

至于为什么运行两次会泄漏而不运行一次,根据经验,这主要是由于在字段/变量中创建和存储对象而没有首先检查对象是否已分配,从而泄漏了以前的引用。构造如下:

TSomething
FMyObject: TMyObject;
[..]

TSomething.Destroy;
begin
  FMyObject.Free;
end;
[...]

//somewhere in code:
FMyObject := TMyObject.Create; //leaks the previous FMyObject

显然不是那么简单,可能隐藏在一些setter中或通过某种列表/容器。。。在这里,我想在不检查的情况下添加到VirtualTreeView…

NodeFree事件仅为已验证的节点调用,已验证通常意味着显示一次或多次的节点(当调用GetText事件时)


编辑:您可以通过检查节点计数和计算调用NodeFree事件的次数来确认。

创建一个显示此行为的小程序,并将其发布到OTL论坛()。我一直都在那里帮助你。我本来打算在你的论坛上发帖的,但我很确定这是虚拟树视图的问题,而事实证明问题出在VTreeview上。顺便说一句,谢谢你,你是对的,如果你在创建节点后放了以下内容,那么内存泄漏就消失了:“vst1.ValidateNode(阳极,False);“我以前在vst中更新节点时使用过ValidateNode,但我从未见过在创建节点时使用它。。。不在任何演示和教程中。谢谢