当您创建 BSTR的并将它们使用以避免内存泄漏的它们在COM对象之间时,必须注意在将内存的。 当 BSTR 在接口中保持,必须释放其内存,当处理它。 但是,那么,当 BSTR 通过在接口外时,接收的对象对其内存管理的责任。
通常,分配和释放为 BSTR分配的内存的规则如下:
在您调用需要 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);
}