Asignación y liberación de memoria para un BSTR
Al crear BSTR
s y pasarlos entre objetos COM, debe tener cuidado al tratar la memoria que usan para evitar pérdidas de memoria. Cuando un elemento BSTR
permanece dentro de una interfaz, debe liberar su memoria cuando haya terminado con ella. Sin embargo, cuando un elemento BSTR
pasa una interfaz, el objeto receptor asume la responsabilidad de su administración de memoria.
En general, las reglas para asignar y liberar memoria asignada para BSTR
son las siguientes:
Cuando se llama a una función que espera un argumento
BSTR
, debe asignar la memoria paraBSTR
antes de la llamada y liberarla después. Por ejemplo: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); }
Cuando se llama a una función que devuelve un
BSTR
, debe liberar la cadena usted mismo. Por ejemplo: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);
Al implementar una función que devuelve un
BSTR
, asigne la cadena pero no la libere. La función receptora libera la memoria. Por ejemplo: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 también
Cadenas (ATL/MFC)
CStringT::AllocSysString
SysAllocString
SysFreeString