Durchsucht mal das Forum. Dort haben schon mehrere (mich eingeschlossen) dieses Phänomen erklärt.
Um es kurz zu machen:
Konstruktor wie
Delphi-Quellcode:
for i := 0 to 100000 do
SetLength(A, Length(a) + 1);
und
Delphi-Quellcode:
for i := 0 to 100000 do
S := S + 'x';
machen im Hintergrund fast genau dasselbe.
Und gemeinsam haben sie, dass sie den Delphi Speichermanager mishandeln. Dieser reserviert nämlich den Speicher in Blöcken von Windows und wenn FreeMem aufgerufen wird, wird dieser Speicher nur wieder an Windows zurückgegeben, wenn der zusammenhängende Block frei ist. Ansonsten merkt sich der Delphi Speichermanager die Position und die Größe des freigegebenen Speicherbereichs um ihn schneller wieder zur Verfügung zu stellen als es Windows je könnte.