Přidělení a uvolnění paměti pro BSTR
Při vytváření BSTR s a jejich předávání mezi objekty COM, musíte dbát v léčení paměti používají, aby se zabránilo nevrácené paměti.Když BSTR zůstává v rámci rozhraní je třeba uvolnit své paměti s ním po dokončení.Nicméně, když BSTR průchodů z rozhraní přijímající objekt přebírá odpovědnost za jeho správy paměti.
Obecně se pravidla pro přidělování a uvolňování paměti přidělené pro BSTR s jsou následující:
Při volání do funkce, která očekává BSTR argument, musíte přidělit paměť pro BSTR před volání a potom ji pustíte.Příklad:
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); }
Při volání do funkce, která vrací BSTR , je třeba uvolnit řetězec sami.Příklad:
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);
Při implementaci funkce vracející BSTR , přidělit řetězec, ale nikoli k jejich uvolnění.Přijímání funkce uvolní paměť.Příklad:
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); }