Zuordnen und Freigeben von Arbeitsspeicher für eine BSTR

Wenn Sie s erstellen BSTR und zwischen COM-Objekten übergeben, müssen Sie darauf achten, den verwendeten Arbeitsspeicher zu behandeln, um Speicherverluste zu vermeiden. Wenn ein BSTR innerhalb einer Schnittstelle verbleibt, müssen Sie dessen Arbeitsspeicher freigeben, wenn Sie damit fertig sind. Wenn jedoch ein BSTR aus einer Schnittstelle übergibt, übernimmt das empfangende Objekt die Verantwortung für seine Speicherverwaltung.

Im Allgemeinen sind die Regeln zum Zuordnen und Freigeben von Speicher, der für s zugeordnet BSTR ist, wie folgt:

  • Wenn Sie eine Funktion aufrufen, die ein BSTR Argument erwartet, müssen Sie den Arbeitsspeicher für vor dem Aufruf zuordnen BSTR und 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 BSTR zurü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 ein BSTR zurückgibt, ordnen Sie die Zeichenfolge zu, geben Sie sie jedoch nicht frei. Der , der die Funktion empfängt, gibt den Arbeitsspeicher 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