当您创建 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);
    }
05-11 16:53