来自C malloc的C#Free IntPtr

时间:2012-09-17 13:18:40

标签: c# c char marshalling intptr

我在C上使用func:

有一个非托管DLL
char* My_Func(char* data, int input_length, int output_length);

在这个功能中我有

result = (char*)malloc(output_lenght);
strcpy(result,test_char);
return(result);

在C#中导入它

[DllImport(@"libsmev.DLL", CharSet = CharSet.Ansi)]
public static extern IntPtr My_Func([MarshalAs(UnmanagedType.LPStr)]string data, int input_length, out int output_length);

并称之为

IntPtr result = My_Func (n1, n1.Lenght,n2);

如何释放char *或IntPtr?

Marshal.FreeHGlobal(IntPtr)和Marshal.FreeCoTaskMem(IntPtr)不起作用。

3 个答案:

答案 0 :(得分:4)

您需要导出一个可以使用free释放指针的函数。您已经注意到Marshal.FreeHGlobal并且Marshal.FreeCoTaskMem不起作用,因为这些函数需要使用不同分配函数分配的指针。

如果您创建一个分配内存并返回指向此内存的指针的API,您还必须在API中添加一个函数来释放内存。否则,您的API将无法在用于分配内存的库外部使用(在本例中为C标准库)。

答案 1 :(得分:3)

在C中,像这样:

void Free_Obj(char* obj) {
    free(obj);
}

在C#中,类似这样:

[DllImport("libsmev.DLL")]
public static extern void Free_Obj(IntPtr obj);

并称之为:

IntPtr result = My_Func (n1, n1.Lenght,n2);
Free_Obj(result);

答案 2 :(得分:0)

您可以使用CoTaskMemAlloc代替malloc来分配内存,而不是在DLL中创建自定义免费功能。

然后,您可以使用Marshal.FreeCoTaskMem释放它。