Delphi 如何注册ExpectedMemoryLeak

Delphi 如何注册ExpectedMemoryLeak,delphi,delphi-2010,fastmm,Delphi,Delphi 2010,Fastmm,让我们从D2010下编码的简单代码开始: var StringList: TStringList; begin ReportMemoryLeaksOnShutdown := True; StringList := TStringList.Create; StringList.LoadFromFile('c:\fateh.txt'); RegisterExpectedMemoryLeak(StringList); FastMM4即使使用Addr(StringList)作为参数

让我们从D2010下编码的简单代码开始:

var
  StringList: TStringList;
begin
  ReportMemoryLeaksOnShutdown := True;
  StringList := TStringList.Create;
  StringList.LoadFromFile('c:\fateh.txt');
  RegisterExpectedMemoryLeak(StringList);
FastMM4即使使用
Addr(StringList)
作为参数,也会反复报告内存泄漏 那么,如何注册预期的MemoryLeak,以及为什么上面的方法不起作用
提前感谢。

您只注册了字符串列表对象的泄漏。您还需要注册正在泄漏字符串列表所拥有的所有对象。在本例中,它拥有
StringList.Count
对象的
string
实例。内存管理器不知道这些字符串属于字符串列表对象,因此也会泄漏

说起来容易做起来难。因为您需要找到表示字符串的内存块的开头。这与字符串的第一个字符有固定的偏移量,偏移量取决于您使用的Delphi版本

在Unicode Delphi中,在32位代码中,偏移量为12字节。因此,以下内容将注册泄漏的字符串:

for i := 0 to StringList.Count-1 do 
  if StringList[i]<>'' then
    RegisterExpectedMemoryLeak(PByte(StringList[i])-12);
对于i:=0到StringList.Count-1 do
如果StringList[i]'',则
RegisterExpectedMemoryLeak(PByte(StringList[i])-12);

即使这样做,您仍然会收到两个内存泄漏报告。其中至少有一个由字符串列表所拥有的动态数组解释,
TStringList.FList
。如果你想登记那次泄密,然后,您需要进行更多的黑客攻击,因为同样,您必须依赖于实现细节来确定该数组的存储位置。

这比我第一眼看到的要复杂一些。谢谢David。也许您可以编写一个
TLeakyStringList
,可以使用它的内部知识来注册自己。这有多糟糕?;-)