Zuordnen und Freigeben des Arbeitsspeichers für eine BSTR

Wenn Sie S erstellen BSTRund zwischen COM-Objekten übergeben, müssen Sie darauf achten, den Arbeitsspeicher zu behandeln, den sie verwenden, um Speicherlecks zu vermeiden. Wenn ein BSTR Benutzer innerhalb einer Schnittstelle bleibt, müssen Sie den Arbeitsspeicher freizugeben, wenn Sie mit ihm fertig sind. Wenn jedoch eine BSTR Schnittstelle ausläuft, übernimmt das empfangende Objekt die Verantwortung für die Speicherverwaltung.

Im Allgemeinen sind die Regeln für die Zuordnung und Freigabe des für s zugewiesenen BSTRSpeichers wie folgt:

  • Wenn Sie eine Funktion aufrufen, die ein BSTR Argument erwartet, müssen Sie den Arbeitsspeicher für den BSTR Aufruf zuweisen und danach freigeben. Beispiel:

    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);
    }
    
  • Wenn Sie eine Funktion aufrufen, die eine BSTRzurückgibt, müssen Sie die Zeichenfolge selbst freimachen. Beispiel:

    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);
    
  • Wenn Sie eine Funktion implementieren, die eine BSTR, die Zeichenfolge zurückgibt, aber nicht frei. Die empfangende Funktion gibt den Speicher frei. Beispiel:

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

Weitere Informationen

Zeichenfolgen (ATL/MFC)
CStringT::AllocSysString
SysAllocString
SysFreeString