如何释放通过从c#编组到c++分配的非托管内存

本文关键字:分配 c++ 内存 何释放 释放 | 更新日期: 2023-09-27 18:08:33

c++代码调用返回字符串的c#方法。我应该如何在c++中释放分配的非托管内存?我应该使用free()还是delete?

c#:

[Guid("52E4971F-E075-41BA-A84F-B6BE8BD66A21")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[ComImport]
public interface ISomeInterface
{
     [return: MarshalAs(UnmanagedType.LPWStr)]
     string SomeMethod([MarshalAs(UnmanagedType.LPWStr)] string text);
}
c++:

class SomeClass
{
    virtual int32_t __stdcall _someMethod(const char16_t *text, char16_t **r) = 0;
    char16_t * someMethod(const char16_t *text)
        {
            char16_t * result;
            _someMethod(text, &result);
            return result; // how to correct release this memory?
        }
}

该解决方案在Windows和Linux上都有效。

如何释放通过从c#编组到c++分配的非托管内存

假设您调用的对象具有如下的COM签名:

interface MyObj
{
   HRESULT __stdcall MethodOrProp([out, retval] BSTR* SomeStringReturned);
};

然后,调用SysFreeString。

MyObj* pObj;
// ....
BSTR bstr = NULL;
HRESULT hr = pObj->MethodOrProp(&bstr);
if (SUCCEEDED(hr))
{
   // ... do junk with string ...
   SysFreeString(bstr);
}

但是,如果你正在使用Visual Studio,那么不用担心,使用CComBSTR。它会在析构函数中为你做清理工作。

CComBSTR ccbString = NULL;
HRESULT hr = pObj->MethodOrProp(&ccbString);
if (SUCCEEDED(hr))
{
   // ... do junk with string ...
}
// some time at end of scope, destructor of ccbString will clean it up