Einzelnen Beitrag anzeigen

Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Frage zu Memory Management

  Alt 9. Feb 2013, 04:00
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.

Geändert von Namenloser ( 9. Feb 2013 um 04:06 Uhr)
  Mit Zitat antworten Zitat