2010-12-10 7 views
3

Es gibt 2 Binärdateien. Einer ist native/nicht verwaltete C++ - DLL und andere ist C# exe verwaltet. Jetzt schreibe ich eine Funktion in C++ dll und reserviere Speicher darin mit malloc. Ich habe diese Funktion exportiert, um von meinem C# -Modul verwendet zu werden.Gibt es eine Notwendigkeit, Speicher in nicht verwaltetem Code freizugeben, wenn es von verwaltetem Code geladen wird

In C++ Ich habe:

char* FunctionHavingAllocatedMemory(int i){ 

char* p = (char*)malloc(100); 

..... 

//use p and do not free it. 

return p; 

} 

In C# ich getan habe:

[DllImport("C++.dll")] 

private static extern string FunctionHavingAllocatedMemory(int i); 

Nun, meine Frage ist: Gibt es eine Notwendigkeit, den freien Speicher in C++ Modul oder C# Modul automatisch frei wenn die Funktion zurückkehrt. Warum ich denke, ist, da C# verwaltetes Modul ist, wird es automatisch den Speicher aufräumen.

(Obwohl es gut ist, haben Sie freien Speicher in C++, aber ich habe bestimmte Einschränkungen, dass ich nicht Speicher in C++ freigeben kann. Ich wollte nur mehr über verwaltete Anwendungen und die Art, wie sie Speicherverwaltung behandeln).

Antwort

2

Der Garbage Collector funktioniert nur auf dem verwalteten Heap: Der Speicher in FunctionHavingAllocatedMemory zugewiesen ist Ihre Verantwortung frei.

0

GC ist verantwortlich für die Verwaltung des Speichers für den verwalteten Code für nicht verwalteten Code. Sie müssen sich Gedanken darüber machen, wie Sie den Speicher wiederherstellen können.

Ich denke, Sie können eine Funktion in der Klasse C++ definieren, die den Speicher intern freigibt.

2

Alternativ können Sie den nicht verwalteten Speicher in C# unter Verwendung Marshal.AllocHGlobal() zuweisen, übergeben Sie einen Zeiger auf Ihre ursprüngliche dll und Marshal.FreeHGlobal() es zurück in C#. Die Marshal Klasse verfügt auch über einige Funktionen zum Kopieren von Daten in den zugewiesenen Speicher oder zum Abrufen von Daten aus dem zugewiesenen Speicher.