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