gpt4 book ai didi

delphi - 如何注册预期的内存泄漏

转载 作者:行者123 更新时间:2023-12-04 05:05:18 24 4
gpt4 key购买 nike

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

var
StringList: TStringList;
begin
ReportMemoryLeaksOnShutdown := True;
StringList := TStringList.Create;
StringList.LoadFromFile('c:\fateh.txt');
RegisterExpectedMemoryLeak(StringList);

即使使用 Addr(StringList),FastMM4 也会一次又一次地报告内存泄漏作为参数
那么如何注册 Expected 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);

即使你这样做了,你仍然会得到两个报告的内存泄漏。其中至少一个由字符串列表拥有的动态数组解释, TStringList.FList .如果您想注册该泄漏,那么您需要做更多的黑客攻击,因为您将不得不再次依赖实现细节来确定该数组的存储位置。

关于delphi - 如何注册预期的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15585704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com