Выделение и освобождение памяти для 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); }