当托管代码加载非托管代码时,是否需要释放内存

时间:2010-12-10 09:15:39

标签: c# c++ memory-management unmanaged managed

有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 ++中释放内存。只是想了解托管应用程序及其处理内存管理的方式。)

3 个答案:

答案 0 :(得分:2)

垃圾收集器仅适用于托管堆FunctionHavingAllocatedMemory中分配的内存是您自由的责任。

答案 1 :(得分:2)

或者,您可以使用Marshal.AllocHGlobal()在C#中分配非托管内存,将指针传递给您的本机dll,然后将其Marshal.FreeHGlobal()传回C#。 Marshal类还具有一些功能,可以将数据复制到分配的内存中或从分配的内存中获取数据。

答案 2 :(得分:0)

GC将负责管理非托管代码的托管代码的内存,您需要担心如何回收内存。

我认为,您可以在c ++类中定义一个内部释放内存的函数。