Udostępnij za pośrednictwem


Alokowanie i zwalnianie pamięci dla typu BSTR

Podczas tworzenia BSTRs i przekazywać je między obiektami COM, należy uważać leczenie pamięci używają w celu uniknięcia przecieki pamięci.Gdy BSTR pobyty w interfejs, należy zwolnić pamięci po zakończeniu z nim.Jednakże, gdy BSTR przechodzi z interfejsu obiekt odbierający przejmuje odpowiedzialność za jego zarządzania pamięcią.

Ogólnie rzecz biorąc, zasady podziału i zwalniania pamięci przydzielone dla BSTRs są następujące:

  • Po wywołaniu do funkcji, która oczekuje BSTR argument, należy przydzielić pamięci dla BSTR przed wywołaniem i zwolnij go 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 do funkcji, która zwraca BSTR, ciąg należy zwolnić samodzielnie.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 implementacji funkcji, która zwraca BSTR, przydzielić ciągu, ale nie jest wolne.Odbieranie funkcji 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ż

Informacje

CStringT::AllocSysString

SysAllocString

SysFreeString

Inne zasoby

Ciągi (ATL/MFC)