관리되지 않은 코드에서 사용하는 .NET 구성 요소에 대한 메모리 관리
-
08-07-2019 - |
문제
관리되지 않는 세상에서 일할 때, 우리는 힙에 메모리를 할당 한 경우 (예 : 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 객체를 수집하지 않습니다.
제휴하지 않습니다 StackOverflow