Delphi FindFirst,FindNext,FindClose内存泄漏

时间:2014-04-02 17:46:27

标签: delphi memory-leaks

我有一段Delphi代码,在一些Windows服务中运行:

if FindFirst(path,faArchive,searchrecord) then  
try  
  DoSomething(searchrecord);  
  while FindNext(searchrecord) do
    DoSomething(searchrecord);  
finally
  FindClose(searchRecord);
end;

这实际上是每个n'在一个线程内的秒(搜索目录内容,然后为在...内找到的每个文件发送邮件)然后新内容将被另一个进程放入该文件夹..然后再次..)。

一切都很好(邮件被发送,文件被移动到另一个文件夹等), 但是我们的客户抱怨内存消耗量很大......快速增长。

所以我们检查一下,首先确认内存泄漏, 然后确定无疑 那段代码.. FindeFirst - > FindNext - > FindClose ..,是'罪犯'

然后搜索和搜索(首先,这个......然后是网络),我们找到了神秘的'

SetProcessWorkingSetSize(GetCurrentProcess(), DWORD(-1), DWORD(-1))

观看herehere ..以及许多其他stackoverflow条目,讨论使用此Windows功能的好处或不便。

最后一个事实是,当执行该代码块时,内存usarge似乎在增加和增加(FindFirst .. FindClose)..在Windows任务管理器中观察此消耗 < /强>

所以..亲爱的伙伴......

  1. 为什么会这样? (这是一些正常行为,一些错误..)
  2. 什么是&#39;解决方案&#39; ? (有待解决的问题&#39;?{SetProcessWorkingSetSize(GetCurrentProcess(), DWORD(-1), DWORD(-1))适用于这种情况?..那么如何使用它?

1 个答案:

答案 0 :(得分:3)

您的问题中的代码无法编译。但是,看起来你只是错误地将它转录到了问题中。

此文件枚举循环本身不会泄漏。它没有问题。如果问题中的代码确实泄漏,那么唯一合理的结论就是DoSomething导致泄密。

调试此方法的常用方法是使用FastMM的完整版本。要求它在关机时报告内存泄漏。运行程序,关闭它并研究诊断。这应该会导致一些泄漏。修复它们直到没有剩下。

至于SetProcessWorkingSetSize(..., -1, -1),将内存从RAM中推出到磁盘上。你当然可以这样做,但它可能导致磁盘颠簸。您将内存推送到磁盘上。然后你需要它并且必须再次将它读入RAM。让系统管理你的记忆。