Alocando e liberando memória para um BSTR
Quando você cria BSTRs e passá-las entre objetos COM, você deve ter cuidado em tratar a memória que use para evitar vazamentos de memória. Quando um BSTR fique em uma interface, você deve liberar sua memória quando tiver terminado com ele. No entanto, quando um BSTR passagens fora de uma interface, o objeto de recebimento tem responsabilidade pelo gerenciamento de memória.
Em geral, sistema autônomo regras para alocar e liberando memória alocada para BSTRsistema autônomo são:
Quando você chama uma função que espera um BSTR argumento, você deve alocar memória para o BSTR antes da telefonar e solte-o 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); }
Quando você telefonar em uma função que retorna um BSTR, você deve liberar a cadeia de caracteres. 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);
Ao implementar uma função que retorna um BSTR, alocar a seqüência de caracteres, mas não liberar. O recebimento da função 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); }