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

时间:2009-08-13 09:10:28

标签: delphi memory-leaks fastmm

FAstMM报告IdStack.pas中TIdCriticalSection的内存泄漏。我知道这是故意泄漏,在代码中有记录。

我不明白,为什么IdStack包含在我的项目中。我怎样才能找出哪个单位拉进来?

是否有办法使用delphi 2007附带的fastmm版本从报告中排除此漏洞?

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

4 个答案:

答案 0 :(得分:8)

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

function RegisterExpectedMemoryLeak(P: Pointer): boolean;

因此,如果您找到了该单元并且事实证明您无法将其删除,则可以使用此方法来抑制内存泄漏警告。

答案 1 :(得分:4)

所有Indy单位都有'Id'前缀,因此请检查您的使用条款中是否包含任何内容。

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

答案 2 :(得分:4)

在'网上有很多关于这个,虽然它是分散的。它还取决于您使用的是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源的路径。我相信Indy 10在这方面是固定的。 布赖恩

答案 3 :(得分:2)

查看.dpr中的Uses 使用cnPack(cnPack.org)并选择“使用清洁程序”删除未引用的单位