7

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

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

有没有办法使用delphi 2007附带的fastmm版本从报告中排除这种泄漏?

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

4

4 回答 4

8

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

function RegisterExpectedMemoryLeak(P: Pointer): boolean;

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

于 2009-08-13T12:28:28.817 回答
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 在这方面是固定的。布赖恩

于 2009-08-13T16:26:00.627 回答
4

所有 Indy 单位都有一个“Id”前缀,因此请检查您的使用条款中是否有任何这些。

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

于 2009-08-13T09:16:04.887 回答
2

查看 .dpr Use cnPack (cnPack.org) 中的 Uses 并选择“Uses Cleaner”以删除未引用的单位

于 2009-08-13T11:14:38.280 回答