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