Compartilhar via


Alocando e liberando memória para um BSTR

Ao criar BSTRs e passá-los entre objetos COM, você deve ter cuidado ao lidar com a memória que eles usam para evitar perda de memória. Quando um BSTR permanece dentro de uma interface, você deve liberar sua memória quando terminar de usá-la. No entanto, quando um BSTR sai de uma interface, o objeto receptor assume a responsabilidade pelo gerenciamento de memória.

Em geral, as regras para alocar e liberar memória alocada para BSTR são as seguintes:

  • Ao chamar uma função que espera um argumento BSTR, você deverá alocar a memória para BSTR antes da chamada e liberá-la posteriormente. Por exemplo:

    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);
    }
    
  • Ao chamar uma função que retorna uma BSTR, você deverá liberar a cadeia de caracteres por conta própria. Por exemplo:

    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);
    
  • Quando implementar uma função que retorna uma BSTR, aloque a cadeia de caracteres, mas não a libere. A função de recebimento libera a memória. Por exemplo:

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

Confira também

Cadeias de caracteres (ATL/MFC)
CStringT::AllocSysString
SysAllocString
SysFreeString