【问题标题】:How can I reclaim memory from using TFileOpenDialog?如何使用 TFileOpenDialog 回收内存?
【发布时间】:2019-02-12 08:31:37
【问题描述】:

在一个简单的 Delphi VCL 应用程序中,表单上有一个按钮和以下 OnButton 事件代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  OpenDialog : TFileOpenDialog;
begin
  OpenDialog := TFileOpenDialog.Create(nil);
  try
    OpenDialog.Options := OpenDialog.Options + [fdoPickFolders];
    if not OpenDialog.Execute then
      exit;
  finally
    OpenDialog.Free;
  end;
end;

当我执行对话框时,我的应用程序内存使用量增加了一倍以上,但在我 OpenDialog.Free 之后,内存没有被释放。(我正在使用 ProcessExplorer 查看我的应用程序正在使用多少内存)

我怎样才能让它在我释放对象后我的内存使用恢复到我调用对话框之前的状态?

【问题讨论】:

    标签: delphi delphi-xe7


    【解决方案1】:

    这是正常操作。内存管理器通常不会将内存返回给系统,而是将其缓存起来以备后用。此外,第一次显示文件对话框时加载的模块仍然在您的进程中加载​​。

    系统完全有可能缓存其他资源以提高文件对话框后续使用的性能。

    这种行为会带来更好的性能。如果您能够强制将内存返回到系统,您的程序将执行得更慢。

    您的代码是正确的。没有泄漏。没有问题需要您解决。

    【讨论】:

    • 所以内存增加来自加载的DLL,那么如果我需要DLL保留的那个X内存空间,如果我需要的话,我以后会得到它吗?
    • 您观察到的任何统计数据都可能有很多原因(没有一个值可以衡量您的进程使用了​​多少内存)。用于加载 DLL 的空间只是众多可能原因之一。你的实际问题是什么?您是否遇到了您认为是由于使用文件对话框导致的内存不足错误?
    • 我只想知道对话框使用的内存空间是否会在我需要的时候被重用?如果调用对话框代码会加载 DLL 并占用 20K KB 的内存空间并在整个应用程序生命周期中持续存在,我想知道如何手动卸载该 DLL(是的,以牺牲性能缓存为代价)。
    • 您无法卸载文件对话框加载的任何 DLL。您无法刷新文件对话框缓存的任何内容。您不能强制进程内存管理器将释放的块返回给系统。您的程序确实没有问题,并且正在寻求创建一个不存在问题的程序。 Windows 虚拟内存非常复杂,不了解这种复杂性的人通常会问您所问的问题。在您对复杂性有更好的理解之前,您应该让系统完成它的工作。它知道自己在做什么。
    • 为什么这与您有关?这些天来,这只是很小的内存量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    相关资源
    最近更新 更多