大佬教程收集整理的这篇文章主要介绍了delphi – 为什么要使用FreeMem / Dispose例程来释放内存,但没有内存减少?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我使用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;
BTW永远不会使用FreeMem作为具有终身管理字段的记录(如您的示例中的字符串) – 它会导致内存泄漏.改用Dispose
对于具有终身管理字段的记录,也不要使用GetMem(在示例中为注释行) – 它会导致访问冲突.使用新的.
以上是大佬教程为你收集整理的delphi – 为什么要使用FreeMem / Dispose例程来释放内存,但没有内存减少?全部内容,希望文章能够帮你解决delphi – 为什么要使用FreeMem / Dispose例程来释放内存,但没有内存减少?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。