2012-02-20 94 views
0

我有大量的C代码,我需要在C#中使用。例如:C中的免费C分配内存#

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

foo()使用malloc()mystring分配内存。我已经尝试了几种从C#中调用这个函数的方法,但我没有释放mystring。您能否请给我一些关于如何拨打foo()的指导方针,以便我以后可以免费拨打mystring

例如,如果char**StringBuilder[]表示,那么我怎样才能使用它在free_string()中被释放?

+2

究竟你是如何调用C代码?我们可以举一些你的尝试代码吗?你的问题目前的状况太模糊,无法准确回答。 – 2012-02-20 09:18:46

+0

在本地分配内存以便在托管中释放相当多的开销,以确保调用者完全知道他们在做什么,您可能需要考虑其他技术来分配托管代码中的内存,例如像这样的http:// stackoverflow .com/questions/8425501/how-can-i-pass-an-empty-string-buffer-that-c​​an-be-written-to-from-native-to-c – dice 2012-02-20 09:23:44

+0

我试着调用几个C代码方式,但我对他们中的任何一个都没有信心。例如:我试过 'static extern long foo( [MarshalAs(UnmanagedType.LPArray,ArraySubType = UnmanagedType.LPStr)] StringBuilder [] mystring);' 我试着'IntPtr ptr'而不是'StringBuilder'和Marshal.FreeCoTaskMem(ptr)。这是行不通的 – pdp11 2012-02-20 09:31:56

回答

0

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

虽然你不能释放malloc与它的内存。作为另一种解决方案,考虑传递C#StringBuilder引用并用C代码填充它。

也看看MSDN article on memory models

1

在本地分配内存以便在托管中释放相当的开销,以确保调用者完全知道他们在做什么,您可能需要考虑其他技术来分配托管代码中的内存。

一个例子可能是使一个回调到托管代码来获得一个字符串缓冲区

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

匹配C#是以下几点:

void GetString(StringBuilder buffer, int bufferSize);