内存泄漏使用VirtualTreeview和OTL

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

使用OTL附带的DEMO项目(线程池#11),我将项目更改为使用VirtualTreeview而不是列表框。 当我从演示“运行任务”没有内存泄漏,但如果我运行“运行任务”不止一次会发生内存泄漏。 如果我多次运行任何任务,将发生内存泄漏。 如果我根本不使用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


NodeFree事件仅针对验证节点调用,验证通常意味着显示一次或多次(当调用GetText事件时)的节点。 使用虚拟TreeView组件时,请参阅内存泄漏

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


我不知道为什么会发生这种情况,但我知道如何找到:打开FastMM的FullDebugMode。 (为此需要从SourceForge下载FastMM完整版。)打开一个选项,在文件中为您提供内存泄漏报告,并确保项目生成详细的映​​射文件。 一旦你完成了这个设置,FastMM将为你提供一个非常详细的内存泄漏报告,并附有堆栈跟踪信息。 这应该有助于缩小发生的情况。


正如梅森所说,FastMM4是你的朋友。 您可能想看看这个CodeRage 2会话:抵御傻瓜内存泄漏。 主要介绍如何使用FastMM防止/检测Delphi中的内存泄漏。 是为D2007,但仍然相关。

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

TSomething
FMyObject: TMyObject;
[..]

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

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

显然不是那么直截了当,可能隐藏在某些setter或通过某种List /容器...在这里,我猜想添加到VirtualTreeView没有检查...

链接地址: http://www.djcxy.com/p/35047.html

上一篇: Memory Leak using VirtualTreeview and OTL

下一篇: How do you detect/avoid Memory leaks in your (Unmanaged) code?