Einen Unterschied zwischen malloc und Marschall.AllocHGlobal?
Schreibe ich ein Modul in C#, dass die Exporte einiger Funktionen verwendet werden, die in C.
Ich brauche zum reservieren von Speicher für einige Strukturen übergeben werden, zwischen C <-> C#.
Was ich zuordnen im C, die ich mit malloc und in C# mache ich mit dem Marschall.AllocHGlobal() (reservieren nicht verwalteten Speicher zu übergeben C).
Gibt es irgendwelche Probleme, wenn ich free() den Speicher mit dem Marschall.AllocHGlobal, und wenn ich Speicher freigeben mit dem Marschall.FreeHGlobal (), die verteilt wurde mit malloc?
Dank
- Vielen Dank für alle Antworten
- Danke. Eigentlich das, was ich Tat, war zu erstellen, die in meiner lib exportierten Funktionen AllocateMem, und FreeMem, die ich empfohlen, verwendet werden, durch aufrufen von Programmen, beim erstellen von Strukturen, die übergeben werden, zu lib. Aber ich Frage mich, ist die nicht Einhaltung dieser Regel, und pass auf meine lib einige Strukturen zugewiesen mit malloc (oder irgendetwas anderes), was soll passieren?
- Die Frage ist, die Strukturen haben einige Zeiger auf char (für strings), die ich habe zu reservieren und übergeben den aufrufenden code. Und was ist, wenn der aufrufende code versuchen zu befreien, dass der Speicher mit free()? Das ist, warum ich erstellt, FreeMem, die ich umgesetzt habe, mit FreeHGlobal, verwendet werden, um Speicher freizugeben, in Berufung prog. Ansonsten ist es in der Verantwortung des Programmierers der aufrufende code.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die goldene Regel ist, dass müssen Sie freigeben aus dem gleichen Haufen, der verwendet wurde, um den Speicher.
Verrechnen Sie es mit
malloc()
müssen Sie freigeben es mit derfree()
aus der gleichen C-RTL. Und ebenfalls auf der verwalteten SeiteAllocHGlobal()
sollte ausgeglichen werden durchFreeHGlobal()
.Nun
AllocHGlobal()
erfolgt durch den Aufruf der Win32-FunktionLocalAlloc
. So konnte man kostenlos solche Speicher mit einem AufrufLocalFree
auf der native Seite. Und Umgekehrt.Wenn Sie wollen, zu einem Haufen, der gemeinsam zwischen systemeigenen und verwalteten, es ist mehr üblich, verwenden Sie das COM-heap. Auf der nativen Seite verwenden
CoTaskMemAlloc()
undCoTaskMemFree()
. Auf der verwalteten Seite verwendenMarshal.AllocCoTaskMem()
undMarshal.FreeCoTaskMem()
.Allerdings sollten Sie es vermeiden, entwerfen das system wie dieses. Es ist viel einfacher, zu bleiben, um in der Regel, dass alle Speicher in der verwalteten Seite freigegeben wird es, und ebenso für die native Seite. Wenn Sie nicht diese Regel befolgen, werden Sie wahrscheinlich verlieren bald den überblick, wer wofür zuständig ist.
Gibt es möglicherweise oder möglicherweise kein problem sein - das ist völlig von der Implementierung abhängig. Verlassen Sie sich nie auf eine Implementierung detail für Ihre app-Funktionalität!
Also ich empfehle nicht zu verwenden
Marshal.AllocHGlobal()
,malloc()
,Marshal.FreeHGlobal()
undfree()
quer.Ein Beispiel, wo Sie in bitterer not ist, wenn Sie verwenden eine Bibliothek, die nicht irgendeine Art von Lust
malloc()/free()
Magie - die Sie vielleicht sogar nicht wissen, dass.