어떻게 하면 릴리즈를 잘 해주까? 일반적으로 RefCount 클래스를 만들어서 쓴다. #pragma once #include "Primary.h" class IReference; class IReferenceSupport; class IReference : public IPrimary { public: IReference(void); virtual ~IReference(void); private: virtual void Clear() = 0; public: virtual void Destroy() = 0; virtual bool Release(); template <typename T> T CopyPtr(T& pOut) { #ifdef _DEBUG ASSERT(sizeof(pOut) > 4); // 포인터가 맞냐? #endif pOut = DCAST(T, this); if (pOut != NULL) AddRef(); return pOut; } private: void AddRef(); void DelRef(); private: long m_nRefCount; private: static IReferenceSupport Support; }; class IReferenceSupport { private: IReferenceSupport(void); virtual ~IReferenceSupport(void); private: void AddRef(); void DelRef(); private: long m_nRefCount; private: friend IReferenceSupport; }; * IReference.cpp #include "Reference.h" IReferenceSupport IReference::Support; IReference::IReference(void) : m_nRefCount(1) { Support.AddRef(); } IReference::~IReference(void) { } void IReference::AddRef() { Support.AddRef(); ++m_nRefCount; } void IReference::DelRef() { ASSERT(m_nRefCount <= 0); Support.DelRef(); --m_nRefCount; } bool IReference::Release() { DelRef(); if (m_nRefCount != 0) return false; delete this; return true; } IReferenceSupport::IReferenceSupport(void) : m_nRefCount(0) { } IReferenceSupport::~IReferenceSupport(void) { ASSERT(m_nRefCount != 0); } void IReferenceSupport::AddRef() { ++m_nRefCount; } void IReferenceSupport::DelRef() { --m_nRefCount; } 생각 해낸 것이... 바로 요곳이다. 일단 Support 클래스 즉 nRefAllCount를 계산 해줄 놈이다. 예전에는 IRefernce에서 nRefAllCount라는 Static 변수를 두어서 계산을 했는데... 클래스로 뺀 다음 그 클래스 모든 멤버함수 및 생성 소멸자 까지 private 선언을 한다. 그리고 사삭 Friend를 걸어준다. 그러게 되면 서포트 클래스는 그 누구도 접근도 생성도 소멸 조차도 불가능 해 진다. 오직 IReference에서만 생성하고 소멸하고 접근할 수 있다. 중요한 것은 이것이다. IReference 클래스 안에 Support 클래스를 스태틱으로 생성 한다. 그러면 이 클래스는 무조건 1개 그 누구도 생성 하지 못하고 IReference 만 생성가능 하기 때문에 언제나 1개 인 것이다. 그리고 소멸자에 모든 RefCount의 갯수를 확인해 보자. 다른 고수 분들은 어떻게 했는지 궁금하다. 그래도 나도 프로그래머 인데... 내 소스를 이뻐해야지..... 그래도 더 좋은 코드가 있다면... 당장 바꺼버려; |

