2010-12-10 29 views
3

有2個二進制文件。一個是本地/非託管C++ DLL,另一個是託管C#EXE。現在我正在做的是在C++ dll中編寫一個函數,並使用malloc在其中分配內存。我導出了這個函數供我的c#模塊使用。當託管代碼加載非託管代碼時是否需要釋放內存

在C++中我所做的:

char* FunctionHavingAllocatedMemory(int i){ 

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

..... 

//use p and do not free it. 

return p; 

} 

在C#中我所做的:

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

private static extern string FunctionHavingAllocatedMemory(int i); 

現在,我的問題是:是否有任何需要在C可用內存++模塊或C#模塊將自動免費它什麼時候函數會返回。爲什麼我在想自從c#是託管模塊它會自動清理內存。

(雖然這是很好的,你可用內存在C++中,但我有一定的限制,我不能釋放內存在C++中,只是想了解更多關於託管的應用程序和他們處理的內存管理的方式)。

回答

2

垃圾收集器只適用於託管堆:在FunctionHavingAllocatedMemory中分配的內存是您的責任,免費。

0

GC將負責爲您不必擔心如何回收內存非託管代碼的託管代碼管理內存。

我認爲,你可以定義在C++函數類,將在內部釋放內存。

2

或者,您可以使用Marshal.AllocHGlobal()在C#中分配非託管內存,並將指針傳遞給您的本機dll,並將其返回到C#中的Marshal.FreeHGlobal()。類還具有將數據複製到分配的內存或從分配的內存中獲取數據的一些功能。