BSTR 用のメモリの割り当てと解放
更新 : 2007 年 11 月
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); }