如果我管理了从非托管代码调用的COM接口,我是否负责在使用后释放内存或者它是否会被垃圾回收处理?
public void WriteOutFile([In] [MarshalAs(UnmanagedType.BStr)] String data)
{
File.WriteAllText(fileName, data);
//do I need the line below??
Marshal.FreeBSTR(data);
}
由于
答案 0 :(得分:4)
编组涉及将数据从非托管内存复制到托管内存。您不需要释放string
实例,因为它是一个托管对象。但是如果在回调调用之前在本机代码中分配内存,则需要在回调调用之后释放本机代码中的内存。
答案 1 :(得分:3)
你不应该释放字符串,因为调用者可能会重用传递的数据,如果你释放它可能会出错。原因是FreeBSTR
不使用任何引用计数机制并简单地调用SysFreeString,顺便说一下假定字符串分配了函数Sys(Re)Alloc...
之一,环境你不是了解托管代码。
示例shown here很有意思,想象一下非托管代码调用你就是这个(来自之前的链接):
// shows using the Win32 function
// to allocate memory for the string:
BSTR bstrStatus = ::SysAllocString(L"Some text");
if (bstrStatus != NULL)
{
pBrowser->put_StatusText(bstrStatus);
// Free the string:
::SysFreeString(bstrStatus);
}
并且您在托管代码中添加了put_StatusText(...)
,我们正在重现您的情况。正如您所看到的那样,调用者负责分配/取消分配参数字符串,外部被调用者。