문제

관리되지 않는 세상에서 일할 때, 우리는 힙에 메모리를 할당 한 경우 (예 : new C ++의 키워드); 우리는 또한 우리를 확인해야합니다 AddRef COM 구성 요소를 사용하여 생성됩니다 CreateInstance 그리고 Release 나중에; 아마도 : 아마도 :

SomeNameSapce::IObjPtr obj;
HRESULT hr = obj.CreateInstance(L"SomeObject");
if (hr == S_OK)
{
    obj->AddRef();
    m_anotherObj= obj->GetObj();
    obj->Release();
}

분명히 우리는 똑똑한 포인터와 다른 것들 (C ++)을 사용할 수 있지만 요점 외에 ...

우리도해야합니까? AddRef/Release COM 구성 요소에서 가져온 물체의 경우 (위의 예에서 M_ANOTHEROBJ와 같은)?

일을 더 혼란스럽게 만들려면 실제로 COM 인터페이스를 통해 관리되지 않는 코드에 노출되는이 특정 구성 요소 인 경우 어떻게됩니까? 쓰레기 수집가는 물건을 정리하는 것을 알고 있거나 관리되지 않은 세상에서 수동으로 수행해야합니까?

도움이 되었습니까?

해결책

CreateInstance 참조 수가 1 인 객체를 돌려 주므로 AddRef 그것. (당신이 사용한 스마트 포인터 Release 마찬가지로, 메소드에서받는 객체는 기준 수가 이미 증가해야하므로 필요하지 않습니다. AddRef 다시 - 그러나 당신은 필요합니다 Release 스마트 포인터를 사용하지 않는 한.

.NET에 노출 된 COM 구성 요소는 다른 기술에서 작성한 COM 구성 요소와 다르지 않습니다. 쓰레기 수집기는 COM 참조에서 참조 된 .NET 객체를 수집하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top