C# 从 C malloc 释放 IntPtr

标签 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) 不起作用。

最佳答案

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

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

关于C# 从 C malloc 释放 IntPtr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12460069/

相关文章:

c++ - 从 char 字符串 c++ 中删除新行

c# - ASP.NET MVC 向扩展的 IdentityRole 添加必需的注释

c# - "Safely"存储(在客户端) token 以供重用?

c - 可以假设哪些依赖项安装在构建机器上?

c - 使用串口时收到额外的空字节

Excel VBA : Missing Project or Library on Chr?

c - C + 中的字符数组访问每个字符

c# - 使用安全 key C# 进行 DES 编码

c# - close, dispose, finalize, GC, Idisposable,....你对它们有清楚的描述吗?

c - 检查 char* 指针是否为空终止字符串的便携方法