delphi – 查找最大的空闲内存块
当碎片化时,有时会出现内存不足的问题.
是否有可能找到最大的可用内存块? 问候 编辑: 我还发现了FastGetHeapStatus方法,该方法返回一个THeapStatus,其中包含一些可用内存字段.也许我可以使用那些. EDIT2: 解决方法
这是您想要的Delphi代码的翻译:
function GetLargestFreeMemRegion(var AAddressOfLargest: pointer): LongWord; var Si: TSystemInfo; P,dwRet: LongWord; Mbi: TMemoryBasicInformation; begin Result := 0; AAddressOfLargest := nil; GetSystemInfo(Si); P := 0; while P < LongWord(Si.lpMaximumApplicationAddress) do begin dwRet := VirtualQuery(pointer(P),Mbi,SizeOf(Mbi)); if (dwRet > 0) and (Mbi.State and MEM_FREE <> 0) then begin if Result < Mbi.RegionSize then begin Result := Mbi.RegionSize; AAddressOfLargest := Mbi.BaseAddress; end; Inc(P,Mbi.RegionSize); end else Inc(P,Si.dwPageSize); end; end; 你可以像这样使用它: procedure TForm1.FormCreate(Sender: TObject); var BaseAddr: pointer; MemSize: LongWord; begin MemSize := GetLargestFreeMemRegion(BaseAddr); // allocate dynamic array of this size SetLength(fArrayOfBytes,MemSize - 16); Caption := Format('Largest address block: %u at %p; dynamic array at %p',[MemSize,BaseAddr,pointer(@fArrayOfBytes[0])]); end; 请注意,我必须从最大大小中减去16个字节,大概是因为动态数组本身使用了从同一块内存中分配的几个字节,因此下一个分配基于16的下一个倍数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |