首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用VirtualTreeview和OTL进行内存泄漏

使用VirtualTreeview和OTL进行内存泄漏
EN

Stack Overflow用户
提问于 2010-10-14 02:25:23
回答 3查看 1.9K关注 0票数 3

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

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

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

示例:

代码语言:javascript
复制
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;

为什么当一个任务多次运行时会出现内存泄漏?带有FastMM4最新虚拟树视图和动态链接库的Delphi2010

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-14 14:16:38

NodeFree事件仅为 validated 节点调用,validated通常表示显示一次或多次(调用GetText事件时)的节点。See Memory Leaks when using the Virtual TreeView Component

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

票数 11
EN

Stack Overflow用户

发布于 2010-10-14 02:39:01

我不知道为什么会发生这种情况,但我知道你可以如何找到答案:打开FastMM的FullDebugMode。(您需要从SourceForge下载FastMM完整版。)打开在文件中给出内存泄漏报告的选项,并确保项目正在生成详细的映射文件。一旦你完成了这个设置,FastMM将给你一个非常详细的内存泄漏报告,包括堆栈跟踪,而不仅仅是一个弹出窗口。这应该可以帮助你缩小正在发生的事情。

票数 4
EN

Stack Overflow用户

发布于 2010-10-14 07:02:52

正如梅森所说,FastMM4是你的朋友。你可能想看看这个CodeRage 2会话:Fighting Memory Leaks for Dummies。它主要展示了如何在Delphi中使用FastMM来预防/检测内存泄漏。是针对D2007的,但仍然是相关的。

至于为什么运行两次会泄漏,但没有运行一次,根据经验,这主要是因为在Field/Variable中创建和存储对象时,没有首先检查它是否被赋值,从而泄漏了之前的引用。构造如下:

代码语言:javascript
复制
TSomething
FMyObject: TMyObject;
[..]

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

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

显然不是那么直接,可能隐藏在一些setter或某种列表/容器中……在这里,我猜测添加到VirtualTreeView而不检查...

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3926757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档