我在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。我是不是遗漏了什么?或者,2009年德尔福的TObjectList中是否有内存泄漏?
发布于 2018-11-21 22:49:18
这两个版本都不会泄漏。你的困惑源自于使用错误的工具来检测泄漏。内存管理器倾向于保留最近使用的内存块,并希望它们能够被重用。
如果希望检测内存泄漏,请使用完整的FastMM库。这将向您显示您的代码不会泄漏。
发布于 2018-11-21 22:32:52
任务管理器只报告应用程序通过Windows请求的内存。Delphi (就像其他编译器一样)有自己的内存分配程序,它以块的形式从Windows请求内存,然后根据需要对其进行子分配。当您释放一个Delphi对象或内存块时,它不一定返回到Windows -Delphi的内存分配程序只是将内存标记为空闲,以便可以在后续内存请求中重用它。窗户对此一无所知。
尝试创建您自己的对象并覆盖它的析构函数--然后您可以在那里放置一个断点,以检查它是否确实被调用。
发布于 2018-11-21 23:58:55
没有内存泄漏。我在Delphi XE6和10.2.3上测试了这两种方法。我用"ReportMemoryLeaksOnShutdown := DebugHook <> 0“来读取内存GetProcessMemoryInfo -> WorkingSetSize。
https://stackoverflow.com/questions/53421218
复制相似问题