Allocation et libération de la mémoire pour un BSTR

Lorsque vous créez BSTRet passez-les entre des objets COM, vous devez prendre soin de traiter la mémoire qu’ils utilisent afin d’éviter les fuites de mémoire. Lorsqu’une BSTR interface reste dans une interface, vous devez libérer sa mémoire lorsque vous l’avez fait. Toutefois, lorsqu’une BSTR interface est passée, l’objet de réception prend en charge sa gestion de la mémoire.

En général, les règles d’allocation et de libération de la mémoire allouée pour BSTRs sont les suivantes :

  • Lorsque vous appelez une fonction qui attend un BSTR argument, vous devez allouer la mémoire pour l’appel BSTR avant l’appel et le libérer par la suite. Par exemple :

    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);
    }
    
  • Lorsque vous appelez une fonction qui retourne un BSTR, vous devez libérer la chaîne vous-même. Par exemple :

    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);
    
  • Lorsque vous implémentez une fonction qui retourne une BSTRchaîne, allouez la chaîne, mais ne la libèrez pas. La fonction de réception libère la mémoire. Par exemple :

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

Voir aussi

Chaînes (ATL/MFC)
CStringT::AllocSysString
SysAllocString
SysFreeString