Udostępnij za pośrednictwem


Przydzielanie i zwalnianie pamięci dla elementu BSTR

Podczas tworzenia BSTRobiektów COM i przekazywania ich między obiektami COM należy zadbać o traktowanie używanej pamięci, aby uniknąć przecieków pamięci. BSTR Gdy element pozostanie w interfejsie, należy zwolnić jego pamięć po zakończeniu pracy z nim. Jednak po BSTR przejściu z interfejsu obiekt odbierający ponosi odpowiedzialność za zarządzanie pamięcią.

Ogólnie rzecz biorąc, reguły przydzielania i zwalniania pamięci przydzielonej dla BSTRs są następujące:

  • Po wywołaniu funkcji, która oczekuje BSTR argumentu, należy przydzielić pamięć przed BSTR wywołaniem i zwolnić ją później. Na przykład:

    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);
    }
    
  • Po wywołaniu funkcji zwracającej wartość BSTR, należy samodzielnie zwolnić ciąg. Na przykład:

    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);
    
  • Podczas implementowania funkcji zwracającej BSTRelement , przydziel ciąg, ale go nie zwalniaj. Funkcja odbierającego zwalnia pamięć. Na przykład:

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

Zobacz też

Ciągi (ATL/MFC)
CStringT::AllocSysString
SysAllocString
SysFreeString