Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Freigabe von Speicher, der in DLL allkokiert wurde (https://www.delphipraxis.net/120830-freigabe-von-speicher-der-dll-allkokiert-wurde.html)

DelphiManiac 17. Sep 2008 13:04


Freigabe von Speicher, der in DLL allkokiert wurde
 
Hallo,
ich habe folgende Problematik:

Ich besitze eine Prozedur die in einer DLL steckt:

Delphi-Quellcode:
procedure Scan (ZeigerAufArray:Pointer; ZeigerAufCounter:Pointer);
Diese Prozedur erwartet ein dynamisches Array.
Dieses Array wird in der Prozedur (DLL) auf eine benötigte Größe gesetzt und der Speicher wird allokiert:

Delphi-Quellcode:
SetLength(ZeigerAufArray^, 5);
Dann wird die Länge des Array im ZeigerAufCounter zurückgegeben,

und der Aufrufer bekommt ein gefülltes Array zurück.

Jetzt meine Frage, wie sollte dann der Speicher wieder freigegeben werden?

Viele Grüße
DM

DeddyH 17. Sep 2008 13:17

Re: Freigabe von Speicher, der in DLL allkokiert wurde
 
Mit SetLength auf 0, oder was meinst Du?

brechi 17. Sep 2008 13:18

Re: Freigabe von Speicher, der in DLL allkokiert wurde
 
Keine Zeiger auf dyn. Arrays übergeben.

Stattdessen ein

TBlub = array of Integer;

procedure Scan(Ar: Tblub; ..)

dann kannst du innerhalb der Scan Funktion das array vergroßern bzw. verkleiner.

DeddyH 17. Sep 2008 13:20

Re: Freigabe von Speicher, der in DLL allkokiert wurde
 
Ein dynamisches Array ist doch bereits ein Zeiger auf das erste Element, oder habe ich das immer falsch verstanden?

DelphiManiac 17. Sep 2008 14:38

Re: Freigabe von Speicher, der in DLL allkokiert wurde
 
Zitat:

Keine Zeiger auf dyn. Arrays übergeben.

Stattdessen ein

TBlub = array of Integer;

procedure Scan(Ar: Tblub; ..)

dann kannst du innerhalb der Scan Funktion das array vergroßern bzw. verkleiner.
Ich übergebe einen Typ (Struktur) der das Array deklariert

TInfo = record
DeviceID: integer;
communicatioResult:Integer;
end;

type TDeviceInfo= array of TInfo;


Aber im Prinzip ist das ja nichts anderes. Es wird der Zeiger übergeben...

Zitat:

Ein dynamisches Array ist doch bereits ein Zeiger auf das erste Element, oder habe ich das immer falsch verstanden?
Das sehe ich aber genauso (dyn. Array = Zeiger auf 1. Element)

brechi 17. Sep 2008 18:57

Re: Freigabe von Speicher, der in DLL allkokiert wurde
 
Siehe den Post hier warum ein Pointer != dynarray ist
http://www.delphi-forum.de/viewtopic.php?t=86016


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