Frage zu malloc und free
-
Hallo, ich benutzt eine Struktur zum Datenaustauch zwischen meiner DLL und meinem Programm, in der Struktur ist unter anderem ein char Pointer. Die Struktur wird im Hauptprogramm erzeugt und der dll übergeben. Meine Frage nun, wenn ich dem char-pointer per malloc in meiner dll eine Größe zuordne und die dll dann irgendwann beendet ist, kann ich dann noch per free(charpointer) im Hauptprogramm den Speicher freigeben oder muß das in dem Programm passieren das auch das malloc aufgerufen hat.
-
^^das wird nicht klappen, weil dll und hauptprogramm höchtswahrscheinlich ihre eigene version von malloc/free haben. ausserdem hat jeder prozess seinen eigenen heap (können auch mehrere sein). wenn du aber winapi-funktionen wie z.b. 'VirtualAlloc' und 'VirtualFree' verwendest, dann geht's (jedenfalls innerhalb eines prozesses). aber frag doch mal im winapi-forum, was noch möglich ist.
-
Ich denke wenn Hauptprogramm und dll die selben mallocs und frees verwenden geht es. Darauf sollte man sich aber nicht verlassen.
Du könntest als Gegenstück zu der dll-Funktion, die malloc aufruft, noch eine Cleanup-Funktion in der dll schreiben, die vom Hauptprogramm aufgerufen werden kann und dann von der dll aus free() aufruft.
-
~fricky schrieb:
^^das wird nicht klappen, weil dll und hauptprogramm höchtswahrscheinlich ihre eigene version von malloc/free haben.
wieso sollten sie das haben? ist das bei windows normal, solche basisfunktionen statisch zu linken?
-
namespace invader schrieb:
Du könntest als Gegenstück zu der dll-Funktion, die malloc aufruft, noch eine Cleanup-Funktion in der dll schreiben, die vom Hauptprogramm aufgerufen werden kann und dann von der dll aus free() aufruft.
Ja das war auch schon meine Überlegung, ich rufe den Inhalt des Buffers im Hauptprogramm ab, und wenn die Bearbeitung getan ist, setze ich in meiner Datenstruktur ein Flag das per while-Schleife in der dll abgefragt wird und sich dann beendet
-
besserwisser schrieb:
~fricky schrieb:
^^das wird nicht klappen, weil dll und hauptprogramm höchtswahrscheinlich ihre eigene version von malloc/free haben.
wieso sollten sie das haben? ist das bei windows normal, solche basisfunktionen statisch zu linken?
Ob statisch oder nicht, es ist ein absolutes no-go Speicher in einem Modul(EXE, DLL) zu allokieren und in einem anderen freizugeben. Das ist nur bei speziellen Funktionen wie z.B. VirtualAlloc, das fricky vorgeschlagen hat, garantiert. malloc wird solche Funktionen eher nicht benutzen, da sie meist langsamer sind als ihre modulgebundenen Äquivalente. Aber das ist alles implementationsabhängig. Ausserdem ist es ja nicht sonderlich viel Aufwand die Deallokierungsfunktion nicht direkt aufzurufen, sondern einen Wrapper.
Gruß
Don06
-
Don06 schrieb:
Ob statisch oder nicht, es ist ein absolutes no-go Speicher in einem Modul(EXE, DLL) zu allokieren und in einem anderen freizugeben.
Jo danke das war auch so ein Grundlangen Wissen über das ich mir Gedanken gemacht habe, jetzt weiss ich Bescheid, danke.
-
besserwisser schrieb:
~fricky schrieb:
^^das wird nicht klappen, weil dll und hauptprogramm höchtswahrscheinlich ihre eigene version von malloc/free haben.
wieso sollten sie das haben? ist das bei windows normal, solche basisfunktionen statisch zu linken?
für C ist es 'ne zwar basisfunktion, windows selber kommt aber ganz gut ohne malloc/free aus. z.b. hat die winapi einige memory-management funktionen verschiedenster granularität. für jeden fall ist was dabei. intern basiert windoofs jedenfalls nicht auf standard c-funktionen. das mag vielleicht bei linux so sein.