2010-12-10 84 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()。类还具有将数据复制到分配的内存或从分配的内存中获取数据的一些功能。