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

3

有两个二进制文件。一个是本地/非托管的C++ dll,另一个是托管的C# exe。现在我正在编写一个函数来使用malloc在c++ dll中分配内存。我导出了这个函数以供我的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个回答

2
垃圾收集器仅对“托管堆”起作用:在FunctionHavingAllocatedMemory中分配的内存由您负责释放。

2

另外,您还可以使用 Marshal.AllocHGlobal() 在C#中分配未托管的内存,将指针传递给本地DLL,并在C#中将其 Marshal.FreeHGlobal() 回收。 Marshal 类还具有一些函数可将数据复制到或从分配的内存中提取数据。


0

GC 负责管理托管代码的内存,对于非托管代码,您需要考虑如何回收内存。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接