wenn du mit obigem Code Memory allozieren möchtest, müsste ja im virtuellen Adressraum die gesamte Grösse
zusammenhängend frei sein... da jedoch teilweise stark verzettelt kleine Bereiche bereits belegt sind, ist es glücksache, wie gross der grösste zusammenhängende freie Speicherblock noch ist...
schau dir mal mittels folgendem Code den virtuellen Adressraum deines Prozesses an:
Delphi-Quellcode:
Procedure VMdump();
Var
Base : Pointer;
MBI : TMemoryBasicInformation;
State : String;
TypeS : String;
begin
Base:=Nil;
While (VirtualQuery(Base,MBI,SizeOf(MBI)) > 0) Do Begin
Case MBI.State Of
MEM_COMMIT : State:='Commit';
MEM_FREE : State:='Free';
MEM_RESERVE : State:='Reserve';
Else State:='-';
end;
Case MBI.Type_9 Of
MEM_IMAGE : TypeS:='Image';
MEM_MAPPED : TypeS:='Mapped';
MEM_PRIVATE : TypeS:='Private';
Else TypeS:='-';
end;
WriteLn(Format('%p..%.8x %.7d %-7s %-7s',[MBI.BaseAddress,LongWord(MBI.BaseAddress) + MBI.RegionSize - 1,MBI.RegionSize div 1024,State,TypeS]));
Base:=Pointer(LongWord(MBI.BaseAddress) + MBI.RegionSize);
end;
end;
bei mir war der grösste "Free"-Block ca. 1.2 GB...
wenn du nun in einer Schlaufe kleinere Blöcke allozieren würdest, wären sicherlich gegen 2 GB möglich...