하루 하루 충실하게 살고 싶다. 하나 하나 충실하게 살고 싶다.
Ctrl + F5 :
프로그램을 실행 합니다.
2009  JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC   :   Prev Year  Next Year
July 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
2005년 05월 14일에 진성이와 현진이는 ♡을 시작했어요.
그러고 보니 벌써 1513일이라는 시간을 만나왔네요.
2009년 09월 29일 앞으로 87일만 있으면 우리가 ♡한지 1600일이 되는 날이랍니다.

어떻게 하면 릴리즈를 잘 해주까? 일반적으로 RefCount 클래스를 만들어서 쓴다.
내가 생각해도 아주 좋은 클래스 이다. 그런데... 어떻게 하면... 프로그램이 종료 될 때
모든 Refernce가 사라졌는지 알 수 있으까? DirectX 같은 경우 프로그램 종료 될 때
메세지 박스 하나가 뜬다. '릴리즈 빼 먹었다!' 안습이 다가온다. 나도 DirectX 처럼
프로그램 종료 될 때 메세지 박스 뛰우고 싶다. ㅡ_ㅡ; 그래서 머리를 굴려보다 만들었다.
다른 고수 분들은 더 멋진 걸 쓰시겠지만.... 나에게는 이거 밖에는 생각이 안난다. 삐질;

* IReference.h

#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의 갯수를 확인해 보자.

다른 고수 분들은 어떻게 했는지 궁금하다. 그래도 나도 프로그래머 인데... 내 소스를
이뻐해야지..... 그래도 더 좋은 코드가 있다면... 당장 바꺼버려;
Trackback : Comment (1) : View
◀ 이전 페이지 : [1] : [2] : [3] : [4] : [5] : .. [100] : 다음 페이지 ▶
2009년 07월 04일
2009년 05월 12일