Alokowanie i zwalnianie pamięci dla typu BSTR
Podczas tworzenia BSTRs i przekazywać je między obiektami COM, należy uważać leczenie pamięci używają w celu uniknięcia przecieki pamięci.Gdy BSTR pobyty w interfejs, należy zwolnić pamięci po zakończeniu z nim.Jednakże, gdy BSTR przechodzi z interfejsu obiekt odbierający przejmuje odpowiedzialność za jego zarządzania pamięcią.
Ogólnie rzecz biorąc, zasady podziału i zwalniania pamięci przydzielone dla BSTRs są następujące:
Po wywołaniu do funkcji, która oczekuje BSTR argument, należy przydzielić pamięci dla BSTR przed wywołaniem i zwolnij go później.Na przykład:
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); }
Po wywołaniu do funkcji, która zwraca BSTR, ciąg należy zwolnić samodzielnie.Na przykład:
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);
Podczas implementacji funkcji, która zwraca BSTR, przydzielić ciągu, ale nie jest wolne.Odbieranie funkcji zwalnia pamięć.Na przykład:
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); }