Hier mal das reine Defragmentierungsproblem
Delphi-Quellcode:
program Project8;
{$APPTYPE CONSOLE}
uses
Types, Windows, SysUtils;
function GetMemSize: Integer;
var
ms: TMemoryStatusEx;
begin
ms.dwLength := SizeOf(ms);
GlobalMemoryStatusEx(ms);
Result := ms.ullTotalVirtual - ms.ullAvailVirtual;
end;
var
i: Integer;
a: TIntegerDynArray;
begin
ReportMemoryLeaksOnShutdown := True;
try
i := 1;
while True
do begin
WriteLn(Format('
a: %0.n mem: %0.n', [i / 1, GetMemSize / 1]));
SetLength(a, i);
i := i * 2;
end;
except
on E:
Exception do
Writeln(E.ClassName, '
: ', E.
Message);
end;
ReadLn;
end.
[]add
Delphi-Quellcode:
while True do
TForm1.Create(self);
ist noch besser, denn es erzeugt kein "echtes" Speicherloch, da kurz vor Programmende der Owner für's Aufräumen sorgt,
aber wärend des Programmablauf's wirkt sich dieses wie ein Speicherleck aus.