2014-01-30 2 views
0

다음은 C++ 프로그램의 주요 방법입니다.COM에서 Release() 함수

int main(){ 

    HRESULT hr = S_OK; 
    IDataCollectorSet* pdcs = NULL; 

    hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); 

    hr = CreateDCS(pdcs); 
    if (FAILED(hr)) 
    { 
     wprintf(L"CreateDCS failed.\n"); 
     goto cleanup; 
    } 

    hr = AddDataCollector(pdcs); 
    if (FAILED(hr)) 
    { 
     wprintf(L"AddDataCollector failed.\n"); 
     goto cleanup; 
    } 

    hr = SaveDCS(pdcs); 
    if (FAILED(hr)) 
    { 
     wprintf(L"SaveDCS failed.\n"); 
     goto cleanup; 
    } 

    hr = pdcs->Start(VARIANT_TRUE); 
    if (FAILED(hr)) 
    { 
     wprintf(L"pdcs->Start failed.\n"); 
     goto cleanup; 
    } 

    getchar(); 
cleanup: 

    if (pdcs) 
     pdcs->Release(); 

    CoUninitialize(); 


} 

"정리"태그 내에서 "Release()"기능으로 수행되는 작업을 이해하지 못합니다. Release() 함수를 * pdcs에 호출 할 수 있으면 IDataCollectorSet 클래스에서 선언해서는 안됩니까? 해당 설명서에서 "Release()"로 정의 된 함수를 찾을 수 없습니다.

어디에서 신고되었으며이 기능의 목적은 무엇입니까?

참고 : 포함 된 헤더 파일은

#include <windows.h> 
#include <stdio.h> 
#include <comutil.h> 
#include <pla.h> 
+0

"Release()"기능은 "C++에서"제공되지 않으며 C++ 표준의 일부가 아닙니다. COM 함수이므로 제목이 다소 잘못 될 수 있습니다. 나는 지금 제목을 편집했다. – sashoalm

+0

고마워요! 내가 질문을 게시했을 때 나는 그것에 대해 몰랐다 – DesirePRG

+0

왜 항상'CreateDCS'의 결과로 그것을 덮어 쓰려고한다면'hr' (S_OK와'CoInitializeEx'의 결과)에 두 개의 값을 할당합니까? – MSalters

답변

5

COM 개체를 사용하고 있고 COM 개체의 메모리 관리가 협조적인 것입니다.

COM 개체의 comsumer로서 COM 개체를 끝낼 때 COM 개체에 알리는 것이 좋습니다. 당신은 Release에 전화해서 이것을한다.

COM 개체 내에 얼마나 많은 사용자가 참조를 가지고 있는지 계산합니다. 참조는 AddRef을 호출하여 증가하고 Release을 호출하여 감소합니다. 참조 횟수가 0이되면 객체는 아무도 다른 객체를 참조하지 않고 메모리를 정리한다는 것을 알게됩니다. 일반적으로 Release 메서드에서 delete this을 호출하여이 작업을 수행합니다.

올바른 장소에서 Release으로 전화하는 것이 중요합니다. 그렇지 않으면 파괴되지 않는 개체를 통해 메모리가 누출됩니다. 원시 COM 포인터 대신 객체가 범위를 벗어날 때 Release을 자동으로 호출하는 CComPtr과 같은 스마트 포인터를 사용하고 객체를 전달할 때 AddRef을 호출하는 것이 가장 좋습니다.

+1

최상의 답변 : 이들은 기본적인 COM 의미론입니다. – MSalters

0

모르겠다. IDataCollectorSet 모르는 사이에 말하기가 힘들지만이 클래스에서받은 몇 가지 리소스를 해제합니다.

관련 문제