Compartir a través de


Asignando y liberando memoria para BSTR

Al crear s para BSTRy las pasa entre los objetos COM, debe tener cuidado de tratar la memoria que utilizan para evitar pérdidas de memoria.Cuando BSTR permanece dentro de una interfaz, debe liberar la memoria cuando termine con él.Sin embargo, cuando BSTR pasa de una interfaz, el objeto receptor asume la responsabilidad de la administración de memoria.

Normalmente las reglas para asignar y liberar memoria asignada para s para BSTRson los siguientes:

  • Cuando se llama a una función que espera un argumento de BSTR , debe asignar memoria para BSTR antes de la llamada y que el mercadola 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 BSTR, debe liberar la cadena personalmente.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 BSTR, asigna la cadena pero no la libere.Recibir los lanzamientos desde la función 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);
    }
    

Vea también

Referencia

CStringT::AllocSysString

SysAllocString

SysFreeString

Otros recursos

Cadenas (y MFC)