Compartilhar via


Atribuindo e liberando memória para um BSTR

Quando você cria BSTRs e os passa entre objetos COM, você deve tomar manipular na memória que usam para evitar vazamentos de memória. Quando BSTR permanece em uma interface, você deve liberar a memória quando você terminar com ele. Em o entanto, quando BSTR passa para fora de uma interface, o objeto de recepção recebe a responsabilidade para o gerenciamento de memória.

Em geral, as regras para atribuir e liberar memória alocada para BSTRs são:

  • Quando você chama em uma função que espera um argumento de BSTR , você deve alocar memória para BSTR antes da chamada e liberar-la mais tarde. 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);
    }
    
  • Quando você chama em uma função que retorna BSTR, você deve liberar a cadeia de caracteres você mesmo. 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 você implementa uma função que retorna BSTR, atribua a cadeia de caracteres mas não para liberar. A receptor de função libera 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);
    }
    

Consulte também

Referência

CStringT::AllocSysString

Outros recursos

Cadeias de caracteres (ATL/MFC)

SysAllocString

SysFreeString