c# - pinvoke:如何释放 malloc 的字符串?

标签 c# .net c mono pinvoke

在 C dll 中,我有一个这样的函数:

char* GetSomeText(char* szInputText)
{
      char* ptrReturnValue = (char*) malloc(strlen(szInputText) * 1000); // Actually done after parsemarkup with the proper length
      init_parser(); // Allocates an internal processing buffer for ParseMarkup result, which I need to copy
      sprintf(ptrReturnValue, "%s", ParseMarkup(szInputText) );
      terminate_parser(); // Frees the internal processing buffer
      return ptrReturnValue;
}

我想使用 P/invoke 从 C# 调用它。

[DllImport("MyDll.dll")]
private static extern string GetSomeText(string strInput);

如何正确释放分配的内存?

我正在编写针对 Windows 和 Linux 的跨平台代码。

编辑: 像这样

[DllImport("MyDll.dll")]
private static extern System.IntPtr GetSomeText(string strInput);

[DllImport("MyDll.dll")]
private static extern void FreePointer(System.IntPtr ptrInput);

IntPtr ptr = GetSomeText("SomeText");
string result = Marshal.PtrToStringAuto(ptr);
FreePointer(ptr);

最佳答案

您应该将返回的字符串编码为 IntPtr,否则 CLR 可能会使用错误的分配器释放内存,从而可能导致堆损坏和各种问题。

看到这个几乎(但不完全)重复的问题 PInvoke for C function that returns char * .

理想情况下,您的 C dll 还应该公开一个 FreeText 函数,供您在希望释放字符串时使用。这确保以正确的方式释放字符串(即使 C dll 更改)。

关于c# - pinvoke:如何释放 malloc 的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7322503/

相关文章:

c# - 验证当前运行的可执行文件

c# - 如何在调用 DBSet<T>.Find(id) 时使 EF Code First 加载 "ICollection"属性

java - 有状态 Java Web 服务和 .NET 客户端

c - 如何使用指针交换 2 个整数?

c - 文件 link(device,socket)/dev/fd/need avoid links transition 的 Linux C 问题

c# - Zebra EPL/ZPL 上的 .NET 网络套接字打印

c# - 读取 com 端口

c# - .NET 核心 3.1 : Ignore expired SSL certficate

c# - 在目录 c# 中查找具有匹配模式的文件?

我们可以在 c 中的 execvp() 中将变量作为命令行参数传递吗