에 대한 메모리 할당 및 해제 BSTR

COM 개체를 만들어 BSTRCOM 개체 간에 전달할 때는 메모리 누수 방지를 위해 사용하는 메모리를 처리하는 데 주의해야 합니다. 인터페이스 내에 BSTR 있는 경우 완료된 경우 해당 메모리를 해제해야 합니다. 그러나 인터페이스에서 BSTR 전달되면 수신 개체는 해당 메모리 관리를 담당합니다.

일반적으로 s에 할당된 BSTR메모리를 할당하고 해제하는 규칙은 다음과 같습니다.

  • 인수가 예상되는 BSTR 함수를 호출할 때 호출 전의 메모리를 BSTR 할당하고 나중에 해제해야 합니다. 예시:

    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직접 해제해야 합니다. 예시:

    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할당하지만 해제하지는 않습니다. 수신 함수는 메모리를 해제합니다. 다음은 그 예입니다.

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

참고 항목

문자열(ATL/MFC)
CStringT::AllocSysString
SysAllocString
SysFreeString