【问题标题】:Delphi forms.pas memory leak?Delphi forms.pas内存泄漏?
【发布时间】:2010-11-02 21:45:55
【问题描述】:

我有一个用 Delphi 2006 编写的动态链接库,它的 uses 子句中有 forms.pas。

如果我加载 dll 然后立即在 for 循环中卸载它,比如 10000 次,内存会慢慢攀升。但是,如果我将 Forms.pas 从 dll 的 uses 子句中取出,那么问题就消失了。

代码很简单

这是我的 dll 代码:

library Project1;

uses
  Forms;

begin

end.

这是我的调用应用程序代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  t_ImportHandle: LongInt;
  t_Index: Integer;
begin
  for t_Index := 0 to 10000 - 1 do
  begin
    t_ImportHandle := LoadLibrary('Project1.dll');
    FreeLibrary(t_ImportHandle);
  end;
 end;

是否有其他人能够复制或知道原因是什么以及如何解决?

【问题讨论】:

    标签: delphi memory dll memory-leaks


    【解决方案1】:

    TApplication.Create 使用 Classes.pas 中的 MakeObjectInstance 函数。 MakeObjectInstance 使用 VirtualAlloc 分配 4KB 缓冲区,但不会释放它,因此每次加载/卸载 DLL 时都会泄漏那么多。 Andreas Hausladen 曾经有一篇关于它的博客文章,但看起来他已经把它拿下来了。 CodeCentral 上发布了一个修复程序,它也包含在 Andreas 的 VCL Fix Pack 包中。

    【讨论】:

    • 我也相信这个特定问题在 Delphi 2010 中已修复。
    • 谢谢,补丁确实解决了这个问题。我想知道而不是使用补丁,我可以在离开 MakeObjectInstance 之前编辑 VCL(因为我已经这样做以修复其他错误)并释放 Block 吗?我查看了代码,但它分配了指向不同变量的指针,所以我无法确定在函数结束时释放块是否安全。
    • @Craig:你知道这是否最终进入了 QC 吗?
    • 看起来它作为 3507 进入了 QC,但被关闭为“按设计”。正如 Ken 所说,在后来的 Delphi 版本中有清理块的代码,所以他们一定在某个时候修复了它。
    • @no spoon:看看 QC#3507。它有一个解决方法,可以释放终结部分中的代码。 Delphi 2010 版本做同样的事情。在 MakeObjectInstance 中释放它肯定是不安全的,根据修复,在 FreeObjectInstance 中释放它可能也不安全。
    【解决方案2】:

    也许这不是泄漏,而是内存管理器碎片问题。

    为什么不尝试使用 FastMM 高级日志记录,看看是否确实存在泄漏。

    【讨论】:

    • 我已经尝试在 DLL 和调用应用程序中使用 FastMM,但问题仍然存在,并且 fastmm 没有报告内存泄漏,实际上它没有报告任何内容。我在调用应用程序中创建了内存泄漏,fastmm 会报告,但是如果我将内存泄漏放入 dll 中,fastmm 不会报告它,也许我设置错了?
    • 无论如何,根据这篇文章forums.codegear.com/messageview.jspa?messageID=296979,这是一个已知问题,但即使我有有效的登录名,我也无法访问链接qc.codegear.com/wc/qcmain.aspx?d=20712
    • 好吧,我已经将问题追溯到与在 Controls.pas 中创建应用程序对象有关的问题。在controls.pas 的初始化部分有一个对InitControls 的调用。在这个方法中,全局 Application 对象被初始化为 TApplication 的一个实例。如果我注释掉这一行和 Application.ShowHint := true 行,那么问题就消失了。但是,在循环中创建和释放 TApplication 对象的实例不会导致内存泄漏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多