BSTR 分配和释放内存

创建 BSTR 并在 COM 对象之间传递它们时,必须注意处理它们使用的内存,以避免内存泄漏。 BSTR 在接口中停留时,你必须在使用完之后释放其内存。 但是,当接口传出 BSTR 时,接收对象负责其内存管理。

一般情况下,分配和释放为 BSTR 分配的内存的规则如下:

  • 调用需要 BSTR 参数的函数时,必须在调用之前为 BSTR 分配内存,并在调用之后释放内存。 例如:

    HRESULT CMyWebBrowser::put_StatusText(BSTR bstr)
    

     

    // 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);
    }
    
  • 调用返回 BSTR 的函数时,必须自行释放字符串。 例如:

    HRESULT CMyWebBrowser::get_StatusText(BSTR* pbstr)
    

     

    BSTR bstrStatus;
    pBrowser->get_StatusText(&bstrStatus);
    
    // shows using the Win32 function 
    // to free the memory for the string: 
    ::SysFreeString(bstrStatus);
    
  • 实现返回 BSTR 的函数时,请分配字符串,但不释放它。 接收函数释放内存。 例如:

    HRESULT CMyClass::get_StatusText(BSTR* pbstr)
    {
       try
       {
          //m_str is a CString in your class
          *pbstr = m_str.AllocSysString();
       }
       catch (...)
       {
          return E_OUTOFMEMORY;
       }
    
       // The client is now responsible for freeing pbstr.
       return(S_OK);
    }
    

另请参阅

字符串 (ATL-MFC)
CStringT::AllocSysString
SysAllocString
SysFreeString