代码之家  ›  专栏  ›  技术社区  ›  Logman

使用VirtualTreeView和OTL的内存泄漏

  •  3
  • Logman  · 技术社区  · 15 年前

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

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

    3 回复  |  直到 14 年前
        1
  •  10
  •   Remko    15 年前

    只为调用nodefree事件 验证的 节点,验证通常意味着节点显示一次或多次(当调用getText事件时)。 See Memory Leaks when using the Virtual TreeView Component

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

        2
  •  4
  •   Mason Wheeler    15 年前

    我不知道为什么会发生这种情况,但我知道你怎么知道:打开fastmm的fulldebugmode。(为此,您需要从sourceforge下载fastmm完整版本。)打开在文件中提供内存泄漏报告的选项,并确保项目生成详细的映射文件。一旦您设置好了这个设置,而不仅仅是弹出窗口,Fastmm将为您提供一个非常详细的内存泄漏报告,包括堆栈跟踪。这可以帮助你缩小范围。

        3
  •  1
  •   Francesca    15 年前

    正如Mason所说, FastMM4 你的朋友在这儿吗?您可能想看一下此coderage 2会话: Fighting Memory Leaks for Dummies . 主要介绍了如何在Delphi中使用fastmm来防止/检测内存泄漏。是为2007年,但仍然相关。

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

    TSomething
    FMyObject: TMyObject;
    [..]
    
    TSomething.Destroy;
    begin
      FMyObject.Free;
    end;
    [...]
    
    //somewhere in code:
    FMyObject := TMyObject.Create; //leaks the previous FMyObject
    

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

    推荐文章