在 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/