gpt4 book ai didi

delphi - TObjectList 内存泄漏?

转载 作者:行者123 更新时间:2023-12-03 19:02:00 27 4
gpt4 key购买 nike

我在 Delphi 7 中有这段代码:

var
Form1: TForm1;
T: TObjectList;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
T := TObjectList.Create(True);
for i := 1 to 10000 do begin
T.Add(TPersistent.Create);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
FreeAndNil(T);
end;

这在 Delphi 2009 中:
var
Form1: TForm1;
T: TObjectList<TPersistent>;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
begin
T := TObjectList<TPersistent>.Create(True);
for i := 1 to 10000 do begin
T.Add(TPersistent.Create);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
FreeAndNil(T);
end;

根据任务管理器,当我在 Delphi 7 中释放 T 时,它使用的所有内存都被释放,但在 Delphi 2009 中,内存不是空闲的,甚至增加了额外的 30 kb。我错过了什么吗?或者 Delphi 2009 中的 TObjectList 中是否存在内存泄漏?

最佳答案

任务管理器仅通过 Windows API 报告应用程序请求的内存。 Delphi(就像所有其他编译器一样)有自己的内存分配器,它以 block 的形式从 Windows 请求内存,然后根据需要对其进行子分配。当您释放一个 Delphi 对象或一 block 内存时,它不一定会返回到 Windows - Delphi 的内存分配器只是将内存标记为空闲,以便可以在后续内存请求中重用它。 Windows 对此一无所知。

尝试创建您自己的对象并覆盖它的析构函数——然后您可以在那里放置一个断点来检查它是否确实被调用。

关于delphi - TObjectList<T> 内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53421218/

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