Bagikan melalui


Mengalokasikan dan Melepaskan Memori untuk BSTR

Ketika Anda membuat BSTRs dan meneruskannya di antara objek COM, Anda harus berhati-hati dalam memperlakukan memori yang mereka gunakan untuk menghindari kebocoran memori. Ketika tetap berada BSTR dalam antarmuka, Anda harus membebaskan memorinya ketika Anda selesai dengannya. Namun, ketika pingsan BSTR dari antarmuka, objek penerima bertanggung jawab atas manajemen memorinya.

Secara umum, aturan untuk mengalokasikan dan merilis memori yang dialokasikan untuk BSTRs adalah sebagai berikut:

  • Ketika Anda memanggil ke fungsi yang mengharapkan BSTR argumen, Anda harus mengalokasikan memori untuk BSTR sebelum panggilan dan melepaskannya setelahnya. Contohnya:

    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);
    }
    
  • Ketika Anda memanggil ke fungsi yang mengembalikan BSTR, Anda harus membebaskan string sendiri. Contohnya:

    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);
    
  • Saat Anda menerapkan fungsi yang mengembalikan BSTR, alokasikan string tetapi jangan bebaskan. Fungsi penerima melepaskan memori. Contohnya:

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

Lihat juga

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