如何释放通过从c#编组到c++分配的非托管内存
How to free an unmanaged memory that was allocated by marshalling from C# to C++
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上都有效。
假设您调用的对象具有如下的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
相关文章:
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 使用RAII在给定次数的迭代后重新分配资源