C#中的免费C分配内存

时间:2012-02-20 09:15:27

标签: c# c memory-management interop

我需要在C#中使用大量的C代码。例如:

long foo(char** mystring);
void free_string(char* mystring);

foo()正在使用malloc()mystring分配内存。我已尝试过几种从C#调用此函数的方法,但我无法释放mystring。您能否给我一些关于如何致电foo()以便我以后可以免费mystring的指南?

例如,如果char**StringBuilder[]表示,那么如何在free_string()中释放它?

2 个答案:

答案 0 :(得分:1)

在托管中释放本机中的内存以确保调用者确切地知道他们正在做什么,这可能需要考虑其他技术来分配托管代码中的内存。

一个例子可能是对托管代码进行回调以获取字符串缓冲区

extern "C" __declspec void GetString( char* buffer, int bufferSize );

匹配C#将如下:

void GetString( StringBuilder buffer, int bufferSize );

答案 1 :(得分:0)

如果您使用LocalAlloc中的kernel32.dll分配内存,则可以使用Marshal.FreeHGlobal(IntPtr)释放内存。虽然你不能用它来释放malloc的内存。

另一种解决方案是考虑传递C#StringBuilder引用并用C代码填充它。

另请查看MSDN article on memory models