Выделение и освобождение памяти для BSTRAllocating and Releasing Memory for a BSTR

При создании BSTRи передаче их между объектами COM необходимо соблюдать осторожность при обработке используемой ими памяти, чтобы избежать утечек памяти.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. Когда элемент BSTR остается в интерфейсе, необходимо освободить его память по завершении.When a BSTR stays within an interface, you must free its memory when you are done with it. Однако, когда BSTR передается из интерфейса, принимающий объект отвечает за управление памятью.However, when a BSTR passes out of an interface, the receiving object takes responsibility for its memory management.

Как правило, для выделения и освобождения памяти, выделенной для BSTR, используются следующие правила:In general, the rules for allocating and releasing memory allocated for BSTRs are as follows:

  • При вызове функции, которая ожидает BSTR аргумент, необходимо выделить память BSTR для перед вызовом и затем освободить его.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. Например: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);
    }
    
  • При вызове функции, возвращающей значение BSTR, необходимо освобождать строку самостоятельно.When you call into a function that returns a BSTR, you must free the string yourself. Например: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);
    
  • При реализации функции, которая возвращает BSTR, выделяет строку, но не освобождает ее.When you implement a function that returns a BSTR, allocate the string but do not free it. При получении функции освобождается память.The receiving the function releases the memory. Например: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);
    }
    

См. такжеSee also

Строки (ATL и MFC)Strings (ATL/MFC)
CStringT::AllocSysStringCStringT::AllocSysString
сисаллокстрингSysAllocString
сисфристрингSysFreeString