Allouant et libère la mémoire pour un BSTR
Lorsque vous créez BSTRs et les passez entre les objets COM, vous devez prendre en charge le traitement de la mémoire qu'ils utilisent pour éviter des fuites de mémoire. Lorsque BSTR reste dans une interface, vous devez libérer la mémoire lorsque vous avez terminé avec elle. Toutefois, lorsque BSTR passe hors d'une interface, l'objet de réception accepte la responsabilité de sa gestion de la mémoire.
En général les règles pour allouer et libérer la mémoire allouée pour BSTRs sont les suivantes :
Lorsque vous appelez une fonction qui attend un argument d' BSTR , vous devez allouer de la mémoire pour BSTR avant l'appel et la libération après. 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 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 BSTR, allouez la chaîne mais ne libérez pas la. Recevoir la fonction 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); }