[英]How to free an unmanaged memory that was allocated by marshalling from C# to C++
C ++代码调用返回字符串的C#方法。 我应该如何释放C ++中分配的非托管内存? 我应该使用free()还是删除?
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上运行。
假设您调用的对象具有这样的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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.