我是否需要释放用作函数参数的托管BSTR

时间:2012-05-12 08:16:23

标签: c# com

如果我管理了从非托管代码调用的COM接口,我是否负责在使用后释放内存或者它是否会被垃圾回收处理?

 public void WriteOutFile([In] [MarshalAs(UnmanagedType.BStr)] String data)
 {
      File.WriteAllText(fileName, data);
      //do I need the line below??
      Marshal.FreeBSTR(data);
 }

由于

2 个答案:

答案 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(...),我们正在重现您的情况。正如您所看到的那样,调用者负责分配/取消分配参数字符串,外部被调用者。