你好

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

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

代码非常简单

这是我的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;

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

最佳答案

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

关于Delphi forms.pas 内存泄漏?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4082384/

10-12 17:12