Das Array kann nur dann verschoben werden, wenn SetLength aufgerufen wird.
Der Grund ist, dass dynamische Arrays unter der Haube auch nur die ganz normalen Funktionen zum Speicheranfordern benutzen. Bevor es dynamische Arrays als Sprachfeature gab, hätte man ein dynamisches Array of Integer so implementiert:
Delphi-Quellcode:
type
TMyIntArray = array[0..0] of Integer;
PMyIntArray = ^TMyIntArray;
procedure DynArrayOldSchool;
var
MyArray: PMyIntArray;
begin
// Array allozieren mit Platz für 25 Integer:
MyArray := AllocMem(25*SizeOf(Integer)); // NEUER POINTER
MyArray[0] := 42;
MyArray[1] := 421;
// ...
// SetLength(MyArray, 50):
MyArray := ReallocMemory(MyArray, 50*SizeOf(Integer)); // (evtl.) NEUER POINTER
// (MyArray[0..24] sind immer noch gleich)
MyArray[25] := 12345;
MyArray[26] := 123456;
// ...
// Am Ende Speicher wieder freigeben:
FreeMemory(MyArray);
end;
Nur in den Zeilen, wo NEUER POINTER steht, gibt der Speichermanager bekannt, an welche Stelle im Speicher er das Objekt gelegt hat. Dazwischen
darf er nicht eigenmächtig etwas verschieben, da sonst die Pointer mal eben still und heimlich ungültig würden, ohne dass das Programm irgendeine Möglichkeit hätte, darauf zu reagieren.
Die Vorgehensweise ist also sicher.