Entwickler-Ecke
Windows API - Speicherallokierung zwischen verschiedenen Modulen
Tobi482 - Fr 01.10.10 16:53
Titel: Speicherallokierung zwischen verschiedenen Modulen
Hi Leute,
ich habe eine Frage zur Speicherverwaltung von Delphi. Ich habe ein C++ Projekt welches eine Delphi7 DLL dynamisch lädt und verwendet. Die exportierte Funktion der DLL reservierte Speicher mit der GetMemory-Funktion und gibt den Pointer zu diesem Speicherblock an das C++ Hauptprogramm zurück. Jedoch habe ich bedenken über Speicherlecks.
Frage 1:
Wenn ich Speicher in einer normalen EXE-Datei reserviere und diesen nicht wieder freigebe, wird der Speicher beim Beenden zwangsweise wieder freigegeben (unschön). Das C++ Hauptprogramm lädt die DLL mit dem Befehl LoadLibrary ein und entfernt sie mit FreeLibrary wieder. Was passiert danach mit dem von der DLL reservierten Speicher?
Wird er wie bei einer normalen EXE "zwangsreleased" und steht dem Hauptprogramm nicht mehr zur Verfügung?
Frage 2:
Kann Speicher der innerhalb der DLL mit GetMemory allokiert wurde im C++ Hauptprogramm mit delete freigegeben werden? Oder bräuchte ich eine extra Funktion in der DLL um den Speicher der von Delphi reserviert wurde auch von Delphi wieder freigeben zu lassen? Wenn ich so eine Funktion brauche, darf die DLL zwischendurch mit FreeLibrary freigegeben werden (1. Dll laden, 2. speicher durch dll reservieren, 3. dll entladen, 4. dll laden, 5. speicher durch dll freigeben, 6. dll entladen)?
Bin für jeden Tipp dankbar :)
Mit freundlichen Grüßen
Tobi
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am Fr 01.10.2010 um 22:54
Delete - Fr 01.10.10 17:23
Normalerweise reserviert man den Speicher in der Exe und übergibt einen Zeiger an die DLL-Funktion. Siehe dazu:
http://www.michael-puff.de/Artikel/StringDLL.shtml
Eine DLL wird erst dann entladen, wenn ihr Referenzzähler null ist.
Tobi482 - Fr 01.10.10 17:43
die dll lädt eine bilddatei. ich kann ja erst einmal als workaround eine funktion getImgWidth und getImgHeight um die allokierung im Hostprozess vorzunehmen. aber die antwort auf die fragen wäre trotzdem interessant
jaenicke - Fr 01.10.10 23:51
Du brauchst gar nicht die Breite und Höhe des Bildes. In der Regel übergibst du einen Speicherbereich an die DLL und dessen Größe als Pointer.
Wenn der Speicherbereich zu klein ist, wird die benötigte Größe in dem Größenparameter zurückgegeben. Dann kannst du genug Speicher reservieren und die Funktion erneut aufrufen.
Wenn dann der Puffer groß genug ist, dann packst du deine Daten dort hinein und gibst die Anzahl der geschriebenen Bytes in dem Größenparameter zurück.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!