Delphi:IdStack中的memoryleak,但谁使用IdStack?

Delphi:IdStack中的memoryleak,但谁使用IdStack?,delphi,memory-leaks,fastmm,Delphi,Memory Leaks,Fastmm,FAstMM从IdStack.pas中的TIdCriticalSection报告memoryleak。我理解这是一个故意泄漏,代码中记录了这一点 我不明白的是,为什么我的项目中包含IdStack。我怎样才能知道是哪个单位把它拉进来的 使用Delphi2007附带的fastmm版本,有没有办法从报告中排除此泄漏 更新: 有没有办法找到构建中包含的所有pas文件?所有Indy单元都有一个“Id”前缀,因此请检查uses子句中是否有这些前缀 另一种方法可能是在TIdStack.create()中放置断

FAstMM从IdStack.pas中的TIdCriticalSection报告memoryleak。我理解这是一个故意泄漏,代码中记录了这一点

我不明白的是,为什么我的项目中包含IdStack。我怎样才能知道是哪个单位把它拉进来的

使用Delphi2007附带的fastmm版本,有没有办法从报告中排除此泄漏

更新:
有没有办法找到构建中包含的所有pas文件?

所有Indy单元都有一个“Id”前缀,因此请检查uses子句中是否有这些前缀

另一种方法可能是在TIdStack.create()中放置断点。最终,有罪的人将出现在调用堆栈中。

看看你的.dpr中的用法
使用cnPack(cnPack.org)并选择“使用清洁剂”删除未引用的单元

Delphi FastMM内存管理器提供了一种方法

function RegisterExpectedMemoryLeak(P: Pointer): boolean;

因此,如果您找到了该单元,但无法将其删除,则可以使用此方法来消除内存泄漏警告。

网络上有很多关于此的内容,尽管它是分散的。这完全取决于您是使用Indy 9(带D7)还是更高版本。我也很难过。对于Indy 9,我在IdComponent.pas中执行了以下操作:

initialization
  GStackCriticalSection := TCriticalSection.Create;

  // BJF Starts
  //RegisterExpectedMemoryLeak(GStackCriticalSection);
  // BJF Ends

finalization
  // Dont Free. If shutdown is from another Init section, it can cause GPF when stack
  // tries to access it. App will kill it off anyways, so just let it leak

  // BJF has removed comments
  FreeAndNil(GStackCriticalSection);
end.
但请注意,必须在库路径中放置指向Indy源的路径。我相信印地10号在这方面是固定的。
Brian

我尝试过断点,但它从不中断。我认为初始化/终结部分是唯一运行的代码。我现在正在做一个大规模的grep,看看是否能找到任何东西。另一个选择是Icarus,一个免费的Pascal分析器子集:哇。听说过cnPack,但从未尝试过。这必须改变!:-)谢谢。不要删除这些评论。在多线程应用程序中,它可能因此而失败。它是一个全局变量,Windows无论如何都会在终止时释放内存和内核句柄(如关键部分)。请参阅此链接及其链接到的文章: