首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TObjectList<T>内存泄漏?

TObjectList<T>内存泄漏?
EN

Stack Overflow用户
提问于 2018-11-21 22:17:35
回答 3查看 378关注 0票数 1

我在Delphi 7中有这样的代码:

代码语言:javascript
复制
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中:

代码语言:javascript
复制
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中是否有内存泄漏?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-11-21 22:49:18

这两个版本都不会泄漏。你的困惑源自于使用错误的工具来检测泄漏。内存管理器倾向于保留最近使用的内存块,并希望它们能够被重用。

如果希望检测内存泄漏,请使用完整的FastMM库。这将向您显示您的代码不会泄漏。

票数 3
EN

Stack Overflow用户

发布于 2018-11-21 22:32:52

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

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

票数 4
EN

Stack Overflow用户

发布于 2018-11-21 23:58:55

没有内存泄漏。我在Delphi XE6和10.2.3上测试了这两种方法。我用"ReportMemoryLeaksOnShutdown := DebugHook <> 0“来读取内存GetProcessMemoryInfo -> WorkingSetSize。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53421218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档