Delphi 如何注册ExpectedMemoryLeak
让我们从D2010下编码的简单代码开始: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)作为参数
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
,可以使用它的内部知识来注册自己。这有多糟糕?;-)