TObjectList <t>内存泄漏?

时间:2018-11-21 22:17:36

标签: delphi

我在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中有内存泄漏?

3 个答案:

答案 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。

相关问题