有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 ++中释放内存。只是想了解托管应用程序及其处理内存管理的方式。)
答案 0 :(得分:2)
垃圾收集器仅适用于托管堆:FunctionHavingAllocatedMemory
中分配的内存是您自由的责任。
答案 1 :(得分:2)
或者,您可以使用Marshal.AllocHGlobal()
在C#中分配非托管内存,将指针传递给您的本机dll,然后将其Marshal.FreeHGlobal()
传回C#。 Marshal
类还具有一些功能,可以将数据复制到分配的内存中或从分配的内存中获取数据。
答案 2 :(得分:0)
GC将负责管理非托管代码的托管代码的内存,您需要担心如何回收内存。
我认为,您可以在c ++类中定义一个内部释放内存的函数。