BSTR
用のメモリの割り当てと解放
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); }
関連項目
文字列 (ATL/MFC)
CStringT::AllocSysString
SysAllocString
SysFreeString