从c++方法接收char*,转换为托管字符串,然后释放内存

本文关键字:字符串 然后 内存 释放 转换 方法 char c++ | 更新日期: 2023-09-27 18:15:47

我有一个第三方非托管c++ dll,我需要从c#调用。c++函数返回一个char*。我已经弄清楚如何将其转换为c#中的托管字符串。但我不知道是否需要释放内存。下面的代码可以工作,除了Marshal.FreeHGlobal(p)抛出"句柄无效"。那么我是否需要释放内存,如果需要,如何释放?

[DllImport("abc.dll", EntryPoint = "?GetVersion@ABC@@QEAAPEADXZ", ExactSpelling = true, CallingConvention = CallingConvention.Cdecl)]
private static extern unsafe char* GetVersionRaw();

public static unsafe string GetVersion()
{
    char* x = Abc.GetVersionRaw(); // call the function in the unmanaged DLL
    IntPtr p = new IntPtr(x);
    string s = Marshal.PtrToStringAnsi(p);
    Marshal.FreeHGlobal(p);
    return s;
}

从c++方法接收char*,转换为托管字符串,然后释放内存

不可能笼统地说明如何释放c++函数返回的任意指针。有很多方法可以产生指针(new, malloc, VirtualAlloc,当你在Windows上,等等)。没有办法通过检查来确定指针来自哪个指针,并且使用错误的释放函数是错误的(这可能会导致进程崩溃)。此外,即使您知道要调用哪个函数,您的代码也可能链接到不同版本的语言运行时库—因此您可能正确地调用了freedelete,但却是不兼容的版本。

Normal过程用于执行分配的库提供相应的释放函数,以适当地释放已分配的内存。如果你正在使用的库没有这个功能,你只需要尝试他们告诉你的,如果它不起作用,就继续执行。

相关文章: