Выделение и освобождение памяти для BSTR
При создании BSTR
и передаче между COM-объектами необходимо обеспечить обработку памяти, используемой ими, чтобы избежать утечки памяти. BSTR
Когда интерфейс остается в пределах интерфейса, вы должны освободить память при завершении работы с ним. Однако при BSTR
выходе из интерфейса получающий объект несет ответственность за управление памятью.
Как правило, правила выделения и освобождения памяти, выделенной для BSTR
s, приведены ниже.
При вызове функции, которая ожидает
BSTR
аргумент, необходимо выделить память передBSTR
вызовом и освободить ее после этого. Например: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); }
При вызове функции, возвращающей значение
BSTR
, необходимо освободить строку самостоятельно. Например: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);
При реализации функции, возвращающей
BSTR
строку, но не освобождайте ее. Получая функцию освобождает память. Например: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); }
См. также
Строки (ATL/MFC)
CStringT::AllocSysString
SysAllocString
SysFreeString