SetLength(X, 0) leitet den Aufruf an DynArrayClear weiter und dieses gibt das Array frei.
Delphi-Quellcode:
procedure DynArraySetLength(var a: Pointer; typeInfo: Pointer; dimCnt: Longint; lengthVec: PLongint);
...
begin
p := a;
// Fetch the new length of the array in this dimension, and the old length
newLength := PLongint(lengthVec)^;
if newLength <= 0 then
begin
if newLength < 0 then
Error(reRangeError);
DynArrayClear(a, typeInfo);
exit;
end;
...
(DynArraySetLength ist die interne Funktion von SetLength bei einem dynamischen Array)
X := nil; ruft bei dynamischen Arrays direkt das DynArrayClear auf, ohne Umweg über SetLength.
(Compiler-Magic ist doch was Tolles

)
PS: sobald ein dyn. Array nicht mehr benötigt wird, gibt Delphi dieses automatisch frei.
(also bei einer lokalen Array-Variable geschieht das in dem Code, welcher sich quasi im end; der Prozedur versteckt)
PS: fehlen eigentlich nur bei mir große Teile von Beitrag #1 und #3?
Ein Therapeut entspricht 1024 Gigapeut.