Zuordnen und Freigeben von Arbeitsspeicher für ein BSTR

Wenn Sie S erstellen BSTRund zwischen COM-Objekten übergeben, müssen Sie darauf achten, den verwendeten Speicher zu behandeln, um Speicherverluste zu vermeiden. Wenn eine BSTR Schnittstelle verbleibt, müssen Sie den Speicher freigeben, wenn Sie damit fertig sind. Wenn jedoch eine BSTR Schnittstelle übergeht, übernimmt das empfangende Objekt die Verantwortung für die Speicherverwaltung.

Im Allgemeinen sind die Regeln zum Zuweisen und Freigeben des für s zugewiesenen BSTRSpeichers wie folgt:

  • Wenn Sie eine Funktion aufrufen, die ein BSTR Argument erwartet, müssen Sie den Speicher für den vor dem BSTR Aufruf zuweisen und es anschließend freigeben. Zum 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 freigeben. Zum 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 BSTRZeichenfolge zurückgibt, weisen Sie die Zeichenfolge zu, geben Sie sie jedoch nicht frei. Die Empfangende Funktion gibt den Speicher frei. Zum 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);
    }
    

Siehe auch

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