Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Frage zu Memory Management (https://www.delphipraxis.net/173129-frage-zu-memory-management.html)

iphi 8. Feb 2013 11:57

Frage zu Memory Management
 
Hallo,

soweit ich verstanden habe, kann der MemoryManager dynamische Arrays im Speicher je nach angeforderter Größe hin und her schieben.

Frage: Wird nur das Array ggf. verschoben, dessen Größe aktuell geändert wird (mit SenLength), oder werden u.U. alle Arrays verschoben?

Hintergrund:
Ein Thread in einer dll soll ein im Hauptprogramm definiertes dynamisches Aray befüllen, wobei das Hauptprogramm aber die Länge des Arrays setzt. Kann sich die dll darauf verlassen, dass, wenn das Array einmal angelegt ist (Länge festgelegt), dass sie das Array immer an derselben Adresse im Speicher findet?

p80286 8. Feb 2013 23:09

AW: Frage zu Memory Management
 
warum? Über @array[0] kannst Du das Array immer erreichen.

Gruß
K-H

Namenloser 9. Feb 2013 04:00

AW: Frage zu Memory Management
 
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.

iphi 9. Feb 2013 06:15

AW: Frage zu Memory Management
 
Klingt logisch und beruhigend. Danke für die ausführliche Erklärung!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz