![]() |
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? |
AW: Frage zu Memory Management
warum? Über @array[0] kannst Du das Array immer erreichen.
Gruß K-H |
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:
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.
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; Die Vorgehensweise ist also sicher. |
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 06:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz