Allocation et libération de la mémoire pour un BSTR
Lorsque vous créez BSTR
et 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 BSTR
s sont les suivantes :
Lorsque vous appelez une fonction qui attend un
BSTR
argument, vous devez allouer la mémoire pour l’appelBSTR
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
BSTR
chaî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