IUnknown은 내부적으로 Reference Count(이하 RC라 칭한다) 값을 가지고 있어서 이 값이 0일때 비로서 메모리에서 해당 CoClass가 해제된다. 그런데 문제는 어떤 CoClass를 사용하다보면 RC 값이 자동으로 증가된다. 하지만 문제는 자동으로 증가되는 이 RC 값이 마찬가지로 자동으로 감소시켜주지 않는다는 점이다. 개발자가 적절한 시점에서 감소시켜줘야 한다. 그렇다면 언제 이 RC 값이 자동으로 증가되는가?
- QueryInterface 할때 ...
- 인터페이스의 포인터 값을 다른 인터페이스 포인터 변수에 할당할때 ...
- 그리고......
1번의 경우는 쉽게 이해할 수 있는데 반해, 2번의 경우는 이해하기가 어렵다. 2번의 경우를 예로 들어보면 아래와 같은 상황이다. IUnknown *pSomething = {...}
IUnknown *pOther = pSomething; QueryInterface를 통해 pSomething을 얻어 온 후, 이를 다른 모듈에 넘기기 위해 pOther에 포인터 값으로 대입을 했을 경우... 바로 이 경우에도 RC 값은 하나 증가한다는 점이다. 고로... pOther를 받은 모듈쪽에서 Release를 한번 호출해줘야 pSomething이 완전이 메모리에서 해제된다. (근데 예전엔 이런 방식이면 AddRef를 호출해야 RC 값이 하나 증가되었는데... VS2005에서 제공되는 ATL에서 정책이 변경되었나..?)
이외에도 RC값을 증가시키는 다른 경우를 생각해보자.
{RC 값을 증가시키는 다른 경우는 무엇일까?}
|