Exportar (0) Imprimir
Expandir todo

Asignar y liberar memoria para un BSTR

Visual Studio .NET 2003

Al crear valores BSTR y pasarlos entre objetos COM, se debe prestar atención al tratar la memoria que utilizan con el fin de evitar pérdidas de memoria. Cuando un valor BSTR permanece en una interfaz, se debe liberar su memoria cuando se haya terminado de utilizarlo. Sin embargo, cuando un valor BSTR sale fuera de una interfaz, el objeto receptor se hace responsable de su administración de memoria.

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

  • Al llamar a un función que espera un argumento BSTR, se debe asignar la memoria para el BSTR antes de la llamada y liberarla después: Por ejemplo:
    HRESULT IWebBrowser2::put_StatusText( BSTR bstr );
    
    // shows using the Win32 function 
    // to allocate memory for the string: 
    BSTR bstrStatus = ::SysAllocString( L"Some text" );
    if (bstrStatus == NULL)
       return E_OUTOFMEMORY;
    
    pBrowser->put_StatusText( bstrStatus );
    // Free the string:
    ::SysFreeString( bstrStatus );
    //...
    
  • Al llamar a una función que devuelve un valor BSTR, debe liberar la cadena. Por ejemplo:
    HRESULT IWebBrowser2::get_StatusText( BSTR FAR* pbstr ); 
    //...
    BSTR bstrStatus;
    pBrowser->get_StatusText( &bstrStatus );
    
    // shows using the Win32 function 
    // to freee the memory for the string: 
    ::SysFreeString( bstrStatus );
    
  • Al implementar una función que devuelve un valor BSTR, asigne la cadena pero sin liberarla. Al recibirse la función se libera la memoria. Por ejemplo:
    // Example shows using MFC's 
    // CString::AllocSysString
    
    //...
    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

Cadenas | CString::AllocSysString | SysAllocString | SysFreeString

Mostrar:
© 2014 Microsoft