Zuweisen und Freigeben von Arbeitsspeicher für einen BSTRAllocating and Releasing Memory for a BSTR

Wenn Sie s BSTRerstellen und diese zwischen COM-Objekten übergeben, müssen Sie den von Ihnen verwendeten Speicher berücksichtigen, um Speicher Verluste zu vermeiden.When you create BSTRs and pass them between COM objects, you must take care in treating the memory they use in order to avoid memory leaks. Wenn eine BSTR in einer Schnittstelle bleibt, müssen Sie Ihren Arbeitsspeicher freigeben, wenn Sie damit abgeschlossen sind.When a BSTR stays within an interface, you must free its memory when you are done with it. Wenn ein jedoch eine BSTR Schnittstelle übergibt, übernimmt das empfangende Objekt die Verantwortung für die Speicherverwaltung.However, when a BSTR passes out of an interface, the receiving object takes responsibility for its memory management.

Im allgemeinen lauten die Regeln zum Zuordnen und Freigeben von Arbeitsspeicher BSTR, der für s reserviert ist, wie folgt:In general, the rules for allocating and releasing memory allocated for BSTRs are as follows:

  • Wenn Sie eine Funktion aufzurufen, die ein BSTR -Argument erwartet, müssen Sie den Speicher für BSTR das vor dem-Befehl zuordnen und anschließend freigeben.When you call into a function that expects a BSTR argument, you must allocate the memory for the BSTR before the call and release it afterwards. Beispiel:For example:

    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 aufzurufen, die einen BSTRzurückgibt, müssen Sie die Zeichenfolge selbst freigeben.When you call into a function that returns a BSTR, you must free the string yourself. Beispiel:For example:

    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 einen BSTRzurückgibt, müssen Sie die Zeichenfolge zuordnen, aber nicht freigeben.When you implement a function that returns a BSTR, allocate the string but do not free it. Die empfangende Funktion gibt den Arbeitsspeicher frei.The receiving the function releases the memory. Beispiel:For example:

    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 auchSee also

Zeichen folgen (ATL/MFC)Strings (ATL/MFC)
CStringT::AllocSysStringCStringT::AllocSysString
SysAllocStringSysAllocString
SysFreeStringSysFreeString