gpt4 book ai didi

delphi - 为什么使用 FreeMem/Dispose 例程释放内存,却没有减少内存?

转载 作者:IT王子 更新时间:2023-10-28 23:32:57 27 4
gpt4 key购买 nike

我使用 AllocMem/GetMem/New 例程分配内存,然后使用 FreeMem/Dispose 例程释放内存。但是我发现(通过 Process Explorer)进程的内存大小没有减少。

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

这是我的测试代码:

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, 0, Rec); // Windows API
end;
FList.Clear;
end;

最佳答案

这就是 Delphi 内存管理器的工作原理——它支持自己的内存缓存,因此它不会将所有释放的内存返回给系统,而是将其保存在缓存中。下一次它分配一个内存,它首先尝试在缓存中找到请求的内存,而不是在系统中。这使得内存分配/释放更快。

顺便说一句,永远不要将 FreeMem 用于具有生命周期管理字段(例如字符串,如您的示例)的记录 - 它会导致内存泄漏。请改用 Dispose

也永远不要将 GetMem 用于具有生命周期管理字段的记录(您的示例中的注释行) - 这会导致访问冲突。使用新建

关于delphi - 为什么使用 FreeMem/Dispose 例程释放内存,却没有减少内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5530322/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com