我在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中有内存泄漏?
答案 0 :(得分:3)
任务管理器仅报告应用程序通过Windows API请求的内存。 Delphi(就像其他所有编译器一样)都有自己的内存分配器,该内存分配器从Windows中分块请求内存,然后根据需要对其进行子分配。当您释放Delphi对象或内存块时,它不一定要返回Windows-Delphi的内存分配器只是将内存标记为空闲,以便可以在后续的内存请求中重用。 Windows对此一无所知。
尝试创建自己的对象并覆盖其析构函数-然后可以在其中放置一个断点以检查它是否确实被调用。
答案 1 :(得分:3)
两个版本都不会泄漏。您的困惑源于使用错误的工具来检测泄漏。内存管理器倾向于保留最近使用的内存块,并希望它们可以被重用。
如果您想检测内存泄漏,请使用完整的FastMM库。这将向您显示您的代码不会泄漏。
答案 2 :(得分:0)
没有内存泄漏。我在Delphi XE6和10.2.3上测试了这两种方法。我用过:“ ReportMemoryLeaksOnShutdown:= DebugHook <> 0;”并读取内存GetProcessMemoryInfo-> WorkingSetSize。