Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Wann Speicher reservieren? (https://www.delphipraxis.net/122047-wann-speicher-reservieren.html)

Mr_G 8. Okt 2008 18:26


Wann Speicher reservieren?
 
Hallo zusammen,
ich wollte mal fragen für welche Konstrukte ich eigentlich Speicher reservieren muss, wenn ich sie an eine API-Funktion übergebe.
Mir ist Beispielsweise bekannt, dass ich das für PChars (= dynamisches Array?) tun muss. Aber wie sieht es mit Record-Strukturen (mit Arrays oder auch ohne) aus?
Gruß

Mr_G

Mr_G 9. Okt 2008 09:07

Re: Wann Speicher reservieren?
 
Also... ich habe nun herausgefunden, dass man natürlich Speicher reservieren muss, wenn man nur mit dem Pointer auf ein solches Konstrukt arbeitet. Wie sieht es aber aus wenn ich z.B. einen Record normal deklariere und dann die Adresse des Records übergebe (ohne vorher was initialisiert zu haben)?
Ich wäre für Tipps in Form "allgemeiner Verhaltensregeln" sehr dankbar!

Sherlock 9. Okt 2008 09:18

Re: Wann Speicher reservieren?
 
Da das Konstrukt bereits existiert, und Du dessen Adresse übergibst, ist der Speicher ja schon vorhanden und adressierbar. Da ist es nicht nötig Speicher zu reservieren.

Im Prinzip brauchst Du New/Dispose nur wenn Du mit dynamischen Variablen hantieren willst.

Sherlock

Medium 9. Okt 2008 09:19

Re: Wann Speicher reservieren?
 
Wenn du mit der Referenz auf ein Record arbeitest, also der Art
Delphi-Quellcode:
var
  x: TMyRecord;
, dann wird für diesen bereits per Compilermagic Speicher reserviert.
Nimmst du statt dessen einen Pointertypen auf einen Record der Art
Delphi-Quellcode:
var
  x: ^TMyRecord;
, so musst du selbst Hand anlegen. Im Grunde wie sonst auch.

Bei Records/Structs die von API Funktionen als reine out-Variablen zurückgeliefert werden, übernimmt diese Funktion meistens auch die Reservierung. Beispielsweise wird in manchen Messages ein Pointer auf einen Struct geliefert, und dort hättest du ja nichtmals die Chance einen Speicherbereich vorher dafür festzulegen. Da die WinAPI aber nicht immer zwangsweise in sich konsistent ist, kannst du eigentlich nur durch Nachschauen im msdn sicher sein wie diese oder jene Funktion es denn gerne hätte. Daher sind Faustregeln hier finde ich eher hinderlich :)

Klaus01 9. Okt 2008 09:19

Re: Wann Speicher reservieren?
 
Guten Morgen Jan,

meinst Du vielleicht sowas -> http://de.wikibooks.org/wiki/Program...ascal:_Records

Wenn Du eine Variable mit einem RecordTypen deklarierst wird bei der "Deklaration"
schon Speicher für diese Variable reserviert.
Das verhält sich genauso wie bei Variablen vom type Integer, Byte, Char o.ä.

Grüße
Klaus

Mr_G 9. Okt 2008 09:27

Re: Wann Speicher reservieren?
 
Danke für die Antworten!
Zitat:

Zitat von Medium
Wenn du mit der Referenz auf ein Record arbeitest, also der Art
Delphi-Quellcode:
var
  x: TMyRecord;
, dann wird für diesen bereits per Compilermagic Speicher reserviert.

Das wars was ich wissen wollte... ich dachte es könnte evtl. erst bei einer ersten Zuweisung der Fall sein.


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