PInvoke:如何释放Malloc;d字符串? [英] pinvoke: How to free a malloc'd string?

查看:0
本文介绍了PInvoke:如何释放Malloc;d字符串?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在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);

CLR

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

查看此几乎(但不完全)重复的问题PInvoke for C function that returns char *

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

这篇关于PInvoke:如何释放Malloc;d字符串?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆