FAstMM报告IdStack.pas中TIdCriticalSection的内存泄漏。我知道这是故意泄漏,在代码中有记录。
我不明白,为什么IdStack包含在我的项目中。我怎样才能找出哪个单位拉进来?
是否有办法使用delphi 2007附带的fastmm版本从报告中排除此漏洞?
更新: 有没有办法找到构建中包含的所有pas文件?
答案 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)并选择“使用清洁程序”删除未引用的单位