我已经创建了一个小的多线程应用程序,我正在尝试将其转换为使用OmniThreadLibrary。我使用Virtualtreeview来显示日志和状态/结果。Vst日志只有两列,并且记录只包含两个字符串字段(非常简单,记录中没有对象)。
使用OTL (线程池#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;为什么当一个任务多次运行时会出现内存泄漏?带有FastMM4最新虚拟树视图和动态链接库的Delphi2010
发布于 2010-10-14 14:16:38
NodeFree事件仅为 validated 节点调用,validated通常表示显示一次或多次(调用GetText事件时)的节点。See Memory Leaks when using the Virtual TreeView Component
编辑:您可以通过检查节点计数和计算调用NodeFree事件的次数来进行确认。
发布于 2010-10-14 02:39:01
我不知道为什么会发生这种情况,但我知道你可以如何找到答案:打开FastMM的FullDebugMode。(您需要从SourceForge下载FastMM完整版。)打开在文件中给出内存泄漏报告的选项,并确保项目正在生成详细的映射文件。一旦你完成了这个设置,FastMM将给你一个非常详细的内存泄漏报告,包括堆栈跟踪,而不仅仅是一个弹出窗口。这应该可以帮助你缩小正在发生的事情。
发布于 2010-10-14 07:02:52
正如梅森所说,FastMM4是你的朋友。你可能想看看这个CodeRage 2会话:Fighting Memory Leaks for Dummies。它主要展示了如何在Delphi中使用FastMM来预防/检测内存泄漏。是针对D2007的,但仍然是相关的。
至于为什么运行两次会泄漏,但没有运行一次,根据经验,这主要是因为在Field/Variable中创建和存储对象时,没有首先检查它是否被赋值,从而泄漏了之前的引用。构造如下:
TSomething
FMyObject: TMyObject;
[..]
TSomething.Destroy;
begin
FMyObject.Free;
end;
[...]
//somewhere in code:
FMyObject := TMyObject.Create; //leaks the previous FMyObject显然不是那么直接,可能隐藏在一些setter或某种列表/容器中……在这里,我猜测添加到VirtualTreeView而不检查...
https://stackoverflow.com/questions/3926757
复制相似问题