Sdílet prostřednictvím


Přidělování a uvolňování paměti pro BSTR

Když vytvoříte BSTRobjekty COM a předáte je mezi objekty MODELU COM, musíte se postarat o zacházení s pamětí, kterou používají, aby nedošlo k nevracení paměti. BSTR Když zůstane v rozhraní, musíte uvolnit jeho paměť, až s ním budete hotovi. Nicméně, když BSTR projde z rozhraní, přijímající objekt přebírá odpovědnost za správu paměti.

Obecně platí, že pravidla přidělování a uvolňování paměti přidělené pro BSTRs jsou následující:

  • Když zavoláte funkci, která očekává BSTR argument, musíte přidělit paměť před BSTR voláním a uvolnit ji následně. Příklad:

    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);
    }
    
  • Při volání funkce, která vrací BSTR, musíte uvolnit řetězec sami. Příklad:

    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);
    
  • Když implementujete funkci, která vrací BSTRřetězec, přidělte řetězec, ale neuvolňujte ji. Přijímající funkce uvolní paměť. Příklad:

    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);
    }
    

Viz také

Řetězce (ATL/MFC)
CStringT::AllocSysString
SysAllocString
SysFreeString