echtes "malloc" in PB (statt "AllocateMemory&

Anfängerfragen zum Programmieren mit PureBasic.
Rozek
Beiträge: 24
Registriert: 06.04.2007 23:41
Wohnort: Böblingen
Kontaktdaten:

echtes "malloc" in PB (statt "AllocateMemory&

Beitrag von Rozek »

Hallo zusammen!

Ich habe folgendes Problem: ich möchte in PB eine DLL für eine Anwendung schreiben, die von mir erwartet, daß ich Daten (Zeichenketten) in vorher (von mir in der DLL) mittels "malloc" angelegten Speicherbereichen erzeuge und die "Gewalt" über diese Bereiche an die Anwendung abtrete.

Mit anderen Worten: die DLL ruft "malloc", die Anwendung später das zugehörige "free".

Mit "AllocateMemory" kann ich in PB zwar Speicher reservieren, dieser wird aber auch weiterhin von PB verwaltet - insbesondere am Ende der Anwendung von PB automatisch wieder freigegeben.

Weiß jemand einen Ausweg aus diesem Dilemma?

- kann man "malloc" von PB aus irgendwie direkt aufrufen (ohne dazu eine weitere DLL schreiben zu müssen)
- kann man PB dazu bewegen, per "AllocateMemory" angelegte Speicherbereiche zu "vergessen"?

Vielen Dank im Voraus für jede Art von Hilfe!
Mit freundlichen Grüßen,

Andreas Rozek
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Jedes Programm gibt automatisch beim Beenden jeden angelegten Speicher wieder frei.
Auch mit malloc. 'AllocateMemory()' von PB macht nichts anderes als malloc auch.
Deswegen kannst du beide Befehle untereinander nutzen.
Rozek
Beiträge: 24
Registriert: 06.04.2007 23:41
Wohnort: Böblingen
Kontaktdaten:

Beitrag von Rozek »

Danke für die schnelle Antwort!

Aber sie löst (vermutlich) nicht das Problem, nämlich daß die oben erwähnte Anwendung den von der DLL reservierten Speicher vermutlich schon vorher freigegeben hat!

Wenn jetzt die DLL entladen wird, versucht sie bereits längst freigegebenen Speicher erneut freizugeben - sollte es da nicht heftig knallen?

Darüber hinaus müßte sich PB unnötigerweise unzählige angeblich noch reservierte Speicherbereiche merken (von denen es annimmt, daß sie noch freigegeben werden müßten) was bei langen Laufzeiten eine ganze Menge Speicher in Anspruch nehmen dürfte.
Mit freundlichen Grüßen,

Andreas Rozek
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Normalerweise sollten die Speicherbereiche einer DLL immer zu denen der Anwendung
gehören, das die DLL geladen und aufgerufen hat.

Aber wenn du dir zu unsicher damit bist, nutz doch einfach die entsprechende API-Funktion GlobalAlloc.
Rozek
Beiträge: 24
Registriert: 06.04.2007 23:41
Wohnort: Böblingen
Kontaktdaten:

Beitrag von Rozek »

Danke für den Tip, aber...

...ich benötige etwas Plattform-unabhängiges.

Derzeit sehe ich keinen anderen Ausweg, als in C eine Mini-DLL (etc.) zu schreiben, die intern "malloc" aufruft.
Mit freundlichen Grüßen,

Andreas Rozek
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Eine Anwendung oder DLL sollte beim entladen nicht selbst den Speicher freigeben. Das übernimmt Windows. Windows gibt automatisch jedweden reservierten Speicher frei, schließt Handles, etc. Von daher ist es gut möglich das die DLL den Speicher garnicht selbst freigibt am Ende.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Rozek
Beiträge: 24
Registriert: 06.04.2007 23:41
Wohnort: Böblingen
Kontaktdaten:

Beitrag von Rozek »

Hmm,

die PB-Dokumentation (zu "AllocateMemory") besagt aber etwas anderes: kein Hinweis darauf, daß sich "AllocateMemory" in einer DLL anders verhält als in einer Anwendung...
Mit freundlichen Grüßen,

Andreas Rozek
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Rozek hat geschrieben: die PB-Dokumentation (zu "AllocateMemory") besagt aber etwas anderes: kein Hinweis darauf, daß sich "AllocateMemory" in einer DLL anders verhält als in einer Anwendung...
Hab ich ja auch nicht geschrieben.

Die Doku besagt folgendes:
Hinweis: Alle reservierten Speicherbereiche werden automatisch freigegeben, wenn das Programm beendet wird.
Das heisst aber nicht zwingend das PB die Speicherbereiche freigibt. Da Windows das sowieso macht, sollte man das auch Windows überlassen und ich nehme mal an das es bei PB auch so ist.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

malloc ist ein 'c' befehl und keine API.

Ein bessere vorgang ist es den Speicher von der Applikation zu erstellung und dann den Zeiger auf den Spiecher zu übergeben.
Ist eine normale vorgehensweise.

Beispiel

Code: Alles auswählen

ProcedureDLL MyFunction(*buffer, len.l)

  If len < $FFFF
    ProcedureReturn #False
  EndIf
  
  PokeS(*buffer, "Hello World")
  
  ProcedureReturn #True
  
EndProcedure


; Applikation

*mem = AllocateMemory($FFFF)

result = MyFunction(*mem, $FFFF)
Debug result
If result
  Debug PeekS(*mem)
EndIf
FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
freak
PureBasic Team
Beiträge: 766
Registriert: 29.08.2004 00:20
Wohnort: Stuttgart

Beitrag von freak »

mk-soft hat recht, malloc() macht unter umständen einiges anders als AllocateMemory().

Einfach den Befehl aus der C runtime importieren:

Code: Alles auswählen

ImportC "msvcrt.lib"
  malloc.i(size)
  realloc.i(*ptr, size)
  free(*ptr)
EndImport

*p = malloc(500)
PokeS(*p, "Hallo Welt")
Debug PeekS(*p)
free(*p)
Antworten