gpt4 book ai didi

delphi - 如何找出特定组件或类使用了多少内存?

转载 作者:行者123 更新时间:2023-12-03 15:50:26 24 4
gpt4 key购买 nike

是否可以检索delphi中单个组件使用的内存量?

我正在从互联网下载简单的字符串,在下载过程结束时我发现内存使用量高达一千兆字节,但是当我查看包含我下载的所有内容的保存文件时,该文件仅在千字节范围内,显然组件发生了一些问题,即使我销毁了它们。

示例:

编辑:

procedure TForm1.OnCreate(Sender: TObject);
var list: TStringList;
begin
list:=TStringList.Create;
list.LoadFromFile('10MB_of_Data.txt');
list.destroy;
end;

我如何知道“list”作为 TStringList 使用了 10 MB 的内存空间?

谢谢。

最佳答案

我认为比较前后的内存使用情况是解决这个问题的方法,因为没有简单的方法可以查看代码块在事后分配了哪些内存......例如,使用上面的字符串列表,类本身只会占用少量内存,因为它由指向其他分配的指针(即字符串数组)组成,并且它本身是指向实际字符串的指针数组......这是一个比较简单的案例。

无论如何,这可以通过 FastMM 来完成,其函数如下......

uses
FastMM4;

function CheckAllocationBy(const AProc: TProc): NativeUInt;
var
lOriginalAllocated: NativeUInt;
lFinalAllocated: NativeUInt;
lUsage: TMemoryManagerUsageSummary;
begin
GetMemoryManagerUsageSummary(lUsage);
lOriginalAllocated := lUsage.AllocatedBytes;
try
AProc;
finally
GetMemoryManagerUsageSummary(lUsage);
lFinalAllocated := lUsage.AllocatedBytes;
end;
Result := lFinalAllocated - lOriginalAllocated;
end;

并且可以像这样使用...

lAllocatedBytes := CheckAllocationBy(
procedure
begin
list:=TStringList.Create;
list.LoadFromFile('10MB_of_Data.txt');
list.Free;
end);

这将告诉你你的字符串列表留下了多少字节(有趣的是,我在第一次运行重复调用时得到了 40 个字节,在调用之前和之后查阅使用日志后得到了 0 个字节,这是在调用之前和之后创建的两个编码类)第一次通话)。如果您想检查泄漏的内存分配在哪里,使用 FastMM 也很简单(尽管我同意上面的观点,如果是第 3 方,那么这不应该是您的问题)。

关于delphi - 如何找出特定组件或类使用了多少内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15622455/

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