我创建了一个小型的多线程应用程序,并尝试将其转换为使用OmniThreadLibrary。我正在使用Virtualtreeview来显示日志和状态/结果。Vst Log只有两列,记录只包含两个字符串字段(非常简单,没有记录内部的对象)。
使用OTL附带的DEMO项目(线程池#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。