我在 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) 不起作用。
最佳答案
您需要导出一个可以使用free
释放指针的函数。正如您所注意到的,Marshal.FreeHGlobal
和 Marshal.FreeCoTaskMem
不起作用,因为这些函数需要使用不同分配函数分配的指针。
如果您创建一个分配内存并返回指向该内存的指针的 API,您还必须在 API 中添加一个函数来释放内存。否则,您的 API 在用于分配内存的库(在本例中为 C 标准库)之外将不可用。
关于C# 从 C malloc 释放 IntPtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12460069/