Přidělování a uvolňování paměti pro BSTR
Když vytvoříte BSTR
objekty COM a předáte je mezi objekty MODELU COM, musíte se postarat o zacházení s pamětí, kterou používají, aby nedošlo k nevracení paměti. BSTR
Když zůstane v rozhraní, musíte uvolnit jeho paměť, až s ním budete hotovi. Nicméně, když BSTR
projde z rozhraní, přijímající objekt přebírá odpovědnost za správu paměti.
Obecně platí, že pravidla přidělování a uvolňování paměti přidělené pro BSTR
s jsou následující:
Když zavoláte funkci, která očekává
BSTR
argument, musíte přidělit paměť předBSTR
voláním a uvolnit ji následně. 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í funkce, která vrací
BSTR
, musíte 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);
Když implementujete funkci, která vrací
BSTR
řetězec, přidělte řetězec, ale neuvolňujte ji. Přijímající 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); }
Viz také
Řetězce (ATL/MFC)
CStringT::AllocSysString
SysAllocString
SysFreeString