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);
    }
    

参照

関連項目

CStringT::AllocSysString

その他の技術情報

文字列 (ATL/MFC)

SysAllocString

SysFreeString