FAstMM 从 IdStack.pas 中的 TIdCriticalSection 报告内存泄漏。我知道这是故意泄漏,代码中记录了这一点。
我不明白的是,为什么 IdStack 包含在我的项目中。我怎样才能知道是什么单位把它拉进来的?
有没有办法使用delphi 2007附带的fastmm版本从报告中排除这种泄漏?
更新:有没有办法找到构建中包含的所有 pas 文件?
FAstMM 从 IdStack.pas 中的 TIdCriticalSection 报告内存泄漏。我知道这是故意泄漏,代码中记录了这一点。
我不明白的是,为什么 IdStack 包含在我的项目中。我怎样才能知道是什么单位把它拉进来的?
有没有办法使用delphi 2007附带的fastmm版本从报告中排除这种泄漏?
更新:有没有办法找到构建中包含的所有 pas 文件?
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 源的路径。我相信 Indy 10 在这方面是固定的。布赖恩
所有 Indy 单位都有一个“Id”前缀,因此请检查您的使用条款中是否有任何这些。
另一种方法可能是在 TIdStack.create() 中放置一个断点。最终,有罪的人将出现在调用堆栈中。
查看 .dpr Use cnPack (cnPack.org) 中的 Uses 并选择“Uses Cleaner”以删除未引用的单位