Share via


참조 계산 구현

참조 계산을 사용하려면 클래스의 구현자와 해당 클래스의 개체를 사용하는 클라이언트 모두에서 작동해야 합니다. 클래스를 구현할 때는 IUnknown 인터페이스의 일부로 AddRefRelease 메서드를 구현해야 합니다. 이러한 두 메서드에는 다음과 같은 간단한 구현이 있습니다.

  • AddRef 는 개체의 내부 참조 수를 증분합니다.
  • 릴리스 는 먼저 개체의 내부 참조 수를 감소시키고 참조 수가 0으로 떨어졌는지 여부를 확인합니다. 이 경우 개체를 더 이상 사용하지 않으므로 Release 함수는 개체의 할당을 취소합니다.

대부분의 개체에 대한 일반적인 구현 방법은 모든 인터페이스 간에 공유되는 이러한 메서드( QueryInterface와 함께)의 구현이 하나뿐이므로 전체 개체에 적용되는 참조 횟수를 갖는 것입니다. 그러나 클라이언트의 관점에서 참조 계산은 엄격하고 명확하게 인터페이스 포인터별 개념이므로 현재 현황 인터페이스 포인터를 기반으로 기능의 일부를 동적으로 생성, 삭제, 로드 또는 언로드하여 이 기능을 활용하는 개체를 구현할 수 있습니다. 이러한 인터페이스는 구어체로 분리 인터페이스라고 합니다.

클라이언트가 새 인터페이스 포인터를 반환하는 QueryInterface와 같은 메서드(또는 API 함수)를 호출할 때마다 호출되는 메서드는 반환된 포인터를 통해 참조 수를 증가시키는 역할을 합니다. 예를 들어 클라이언트가 개체를 처음 만들 때 클라이언트의 관점에서 참조 개수가 1인 개체에 대한 인터페이스 포인터를 받습니다. 클라이언트가 인터페이스 포인터에서 AddRef 를 호출하면 참조 수가 2가 됩니다. 클라이언트는 개체에 대한 모든 참조를 삭제하려면 인터페이스 포인터에서 Release 를 두 번 호출해야 합니다.

클라이언트가 새 인터페이스 또는 동일한 인터페이스에 대한 첫 번째 포인터에서 QueryInterface 를 호출할 때 참조 개수가 인터페이스별 포인터를 엄격하게 지정하는 방법의 예입니다. 이러한 경우 중 하나에서 클라이언트는 각 포인터에 대해 Release 를 한 번 호출해야 합니다. COM에서는 동일한 인터페이스를 여러 번 요청할 때 개체가 동일한 포인터를 반환할 필요가 없습니다. 유일한 예외는 COM에 대한 개체를 식별하는 IUnknown에 대한 쿼리입니다. 이렇게 하면 개체 구현에서 리소스를 효율적으로 관리할 수 있습니다.

스레드 안전은 AddRefRelease를 구현하는 데 중요한 문제이기도 합니다. 자세한 내용은 프로세스, 스레드 및 아파트를 참조하세요.

참조 계산을 통해 개체 수명 관리