Share via


Asignación y liberación de memoria para un BSTR

Al crear BSTRs y pasarlos entre objetos COM, debe tener cuidado al tratar la memoria que usan para evitar pérdidas de memoria. Cuando un elemento BSTR permanece dentro de una interfaz, debe liberar su memoria cuando haya terminado con ella. Sin embargo, cuando un elemento BSTR pasa una interfaz, el objeto receptor asume la responsabilidad de su administración de memoria.

En general, las reglas para asignar y liberar memoria asignada para BSTR son las siguientes:

  • Cuando se llama a una función que espera un argumento BSTR, debe asignar la memoria para BSTR antes de la llamada y liberarla después. Por ejemplo:

    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);
    }
    
  • Cuando se llama a una función que devuelve un BSTR, debe liberar la cadena usted mismo. Por ejemplo:

    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);
    
  • Al implementar una función que devuelve un BSTR, asigne la cadena pero no la libere. La función receptora libera la memoria. Por ejemplo:

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

Consulte también

Cadenas (ATL/MFC)
CStringT::AllocSysString
SysAllocString
SysFreeString