Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicher reallokieren (https://www.delphipraxis.net/9995-speicher-reallokieren.html)

Phoenix 9. Okt 2003 11:01


Speicher reallokieren
 
Hi,

ich steh grad auf dem Schlauch was das neuallokieren von Speicher angeht:

Beispiel:
Delphi-Quellcode:
procedure Test;
var
   myTest: PByteArray;
begin
   GetMem(myTest,15);
   
   // was muss ich machen, um noch 10 Bytes mehr zu dem bereits allokierten
   // Speicher dazu zu bekommen?
   
   FreeMem(myTest,25);
end;

Delphianer 9. Okt 2003 11:19

Re: Speicher reallokieren
 
Versuchs mal mit ReallocMem.

Grüße

Phoenix 10. Okt 2003 07:04

Re: Speicher reallokieren
 
Hab grad festgestellt, das das so gar nicht klappen kann :wall:

Weil:
Die Deklaration von PByteArray:
Delphi-Quellcode:
  PByteArray = ^TByteArray;
  TByteArray = array[0..32767] of Byte;
Demnach hat ein PByteArray^ immer eine Länge von 32768 byte, dann kann man reallokieren wollen wie man möchte.

Lösung:
Delphi-Quellcode:
  MyByteArray = array of byte;
  PMyByteArray = ^MyByteArray;
Vorteil bei PMyByteArray: Ich allokiere ihn mit GetMem, kann dann aber mit Length und SetLength wie mit einem regulären Array arbeiten und auch eine neue Größe zuordnen, was bei PByteArray dank der konstanten Länge nicht funzt.

Motzi 10. Okt 2003 07:24

Re: Speicher reallokieren
 
Zitat:

Zitat von Phoenix
Hab grad festgestellt, das das so gar nicht klappen kann :wall:

Weil:
Die Deklaration von PByteArray:
Delphi-Quellcode:
  PByteArray = ^TByteArray;
  TByteArray = array[0..32767] of Byte;
Demnach hat ein PByteArray^ immer eine Länge von 32768 byte, dann kann man reallokieren wollen wie man möchte.

Nein... wenn du nur 15 Bytes reservierst, dann hat dein Array auch nur 15 Bytes auf die du zugreifen kannst, egal wie TByteArray jetzt deklariert ist! Durch das dereferenzieren des Pointers simulierst du zwar praktisch einen Zugriff auf ein Array mit konstanter Länge von 32767 Bytes, aber wie lang das Array jetzt wirklich ist (also wieviel reservierter Speicherplatz dahinter steckt), das kommt nur darauf an wieviel zu alloziert hast!

BTW: ein dyn. Array ist bereits nur ein Pointer der implizit dereferenziert wird, einen Pointer auf ein dyn. Array zu deklarieren ist also irgendwie "doppeltgemoppelt"! ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:35 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