Delphi   发布时间:2022-04-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了delphi – 为什么要使用FreeMem / Dispose例程来释放内存,但没有内存减少?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用AllOCMem / GetMem /新例程分配内存,然后使用FreeMem / Dispose例程释放内存.但是我发现(由Process Explorer),进程的内存大小没有减少.

如果我使用GlobalAllocPtr / HeapAlloc和GlobalFreePtr / HeapFree API,内存大小会减少.

这是我的测试@R_197_11346@

type
  TMyRec = record
    Name: String;
    TickCount: Cardinal;
    Buf: arraY[0..1024 - 1] of byte;
  end;
  PMyRec = ^TMyRec;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FList.Free;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FList := TList.Create;
  ReportMemoryLeaksOnShutdown := true;
end;

procedure TForm1.button1Click(Sender: TObject);
var
  i: Integer;
  Size: Integer;
  Rec: PMyRec;
  Heap: Cardinal;
begin
  Size := SizeOf(TMyRec);
  Heap := GetProcessHeap;
  for I := 0 to 2000 - 1 do
  begin
    Rec := AllOCMem(SizE);                              // Delphi routIne
    //GetMem(Rec,SizE);                                // Delphi routIne
    //New(Rec);                                         // Delphi routIne

    //Rec := GlobalAllocPtr(GPTR,SizE);                // Windows API
    //Rec := HeapAlloc(Heap,HEAP_ZERO_MEMORY,SizE);   // Windows API
    FList.Add(Rec);
  end;
end;

procedure TForm1.button2Click(Sender: TObject);
var
  i: Integer;
  Size: Integer;
  Rec: PMyRec;
  Heap: Cardinal;
begin
  Size := SizeOf(TMyRec);
  Heap := GetProcessHeap;
  for i := FList.Count - 1 downto 0 do
  begin
    Rec := PMyRec(FList.Items[i]);
    FreeMem(Rec,SizE);            // Delphi routIne
    //Dispose(Rec);                // Delphi routIne

    //GlobalFreePtr(Rec);          // Windows API
    //HeapFree(Heap,Rec);      // Windows API
  end;
  FList.Clear;
end;

解决方法@H_944_10@
这就是Delphi内存管理器的工作原理 – 它支持它自己的内存缓存,以便它不会将每个释放的内存都返回到系统,而是将其保存在缓存中.下次再分配一个内存,首先尝试在缓存中找到请求的内存,而不是在系统中.这使得内存分配/释放更快.

BTW永远不会使用FreeMem作为具有终身管理字段的记录(如您的示例中的字符串) – 它会导致内存泄漏.改用Dispose

对于具有终身管理字段的记录,也不要使用GetMem(在示例中为注释行) – 它会导致访问冲突.使用新的.

大佬总结

以上是大佬教程为你收集整理的delphi – 为什么要使用FreeMem / Dispose例程来释放内存,但没有内存减少?全部内容,希望文章能够帮你解决delphi – 为什么要使用FreeMem / Dispose例程来释放内存,但没有内存减少?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。