1. 이런 저런 오류를 피하기 위해서, COM 객체를 레퍼런스 카운터를 통해서 수명 관리하는 것이 국룰이다.
2. 인터페이스를 만들고 구현은 파생에서 하도록 한다.
//Library.h
#pragma once
struct IHen
{
virtual void __stdcall Cluck() = 0;
virtual void __stdcall Roost() = 0;
virtual void __stdcall Addref() = 0;
virtual void __stdcall Release() = 0;
};
IHen* __stdcall CreateHen();
3. 멤버 변수로 레퍼런스 카운터를 추가하고, 초기화는 유니폼으로 하는 것이 국룰이다. Release에서는 레퍼런스 카운터가 0이 되면 인스턴스를 자동으로 삭제하는 것이 국룰이다. 암튼 국룰을 따른다.
//Library.cpp
#include "Library.h"
#include <Windows.h>
#define TRACE OutputDebugString
struct Hen : IHen
{
unsigned m_count;
Hen() : m_count(0)
{
TRACE("Constructor\n");
}
~Hen()
{
TRACE("Destructor\n");
}
void __stdcall Cluck()
{
TRACE("Cluck");
}
void __stdcall Roost()
{
TRACE("Roost");
}
void __stdcall Addref()
{
++m_count;
}
void __stdcall Release()
{
if (0 == --m_count)
{
delete this;
}
}
};
IHen* __stdcall CreateHen()
{
IHen* result = new Hen;
result->Addref();
return result;
}
4. COM 객체의 수명 관리는 대충 이런식으로 한다.
#include "Library.h"
int main()
{
IHen* hen = CreateHen();
hen->Cluck();
hen->Roost();
{
IHen* hen2 = hen;
hen2->Addref();
hen2->Roost();
hen2->Release();
}
hen->Release();
}
5. 스코프 안에서 레퍼런스 카운터가 2가 됬다가 다시 1이 된다. 마지막으로 hen->Release() 를 호출하면서 레퍼런스 카운터가 0이 되어, 내부에서 delete를 호출하게 된다.
'삽질 > COM' 카테고리의 다른 글
COM study note 7 (0) | 2020.10.29 |
---|---|
COM study note 6 인터페이스 상속 (0) | 2020.10.28 |
COM study note 4 인터페이스 (0) | 2020.10.27 |
COM study note 3 다이나믹 링킹 (0) | 2020.10.27 |
COM study note 2 역사 (0) | 2020.10.26 |