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
복사했습니다!