Alocando e liberando memória para um BSTR
Ao criar BSTR
s 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 paraBSTR
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