从C+封送CString时如何(如果需要)释放动态内存+;到C#? C++上的cSnccs和IntPtr ip的C端,包含封送机制的CS值。

从C+封送CString时如何(如果需要)释放动态内存+;到C#? C++上的cSnccs和IntPtr ip的C端,包含封送机制的CS值。,c#,c++,memory-management,dynamic,cstring,C#,C++,Memory Management,Dynamic,Cstring,然后,我简单地得到所需的字符串作为Marshal.PtrToStringAnsi(ip),一切正常,但我想知道我是否应该,如果应该,如何删除ip占用的非托管内存,即cs?非托管代码分配的非托管内存只能由非托管代码释放。因此,您需要添加另一个非托管函数,该函数将获取指向已分配字符串的指针并释放内存。一旦托管代码处理完字符串,就应该从托管代码调用此函数 例如: class Program { [DllImport("test.dll")] static extern IntPtr G

然后,我简单地得到所需的字符串作为Marshal.PtrToStringAnsi(ip),一切正常,但我想知道我是否应该,如果应该,如何删除ip占用的非托管内存,即cs?

非托管代码分配的非托管内存只能由非托管代码释放。因此,您需要添加另一个非托管函数,该函数将获取指向已分配字符串的指针并释放内存。一旦托管代码处理完字符串,就应该从托管代码调用此函数

例如:

class Program
{
    [DllImport("test.dll")]
    static extern IntPtr GetString();

    [DllImport("test.dll")]
    static extern IntPtr FreeString(IntPtr ptr);

    static void Main()
    {
        IntPtr ptr = GetString();
        try
        {
            var str = Marshal.PtrToStringAnsi(ptr);
            // work with the string
        } 
        finally 
        {
            if (ptr != IntPtr.Zero)
            {
                FreeString(ptr);
            }
        }
    }
}

不能,您不知道非托管代码使用了什么分配器来创建CString实例。此外,您必须调用CString析构函数,无法获取其地址


<如果你把这个字符串对象返回C++调用函数的函数返回值,那么你就死在水中了。你的问题不清楚。您将出现无法控制的内存泄漏。需要使用C++/CLI编写的包装器来修复该问题。作为函数返回值返回的字符串必须由CoTaskMemAlloc()分配,才能由P/Invoke封送器正确清理。没有C++代码。CString FreeString,你在C++方面说函数应该是这样的:(cScN-CS){…}如果这个函数应该如何实现?不,它应该看起来像“代码>空FielStand(cStultCs)< /Cuth>。就实施而言,也许一些C++专家可以给出他的两分钱。