언제나휴일 2009. 8. 19. 05:47
반응형
new   는 오버로딩 가능합니다.

 

이에 대한 얘기를 하기 전에 먼저 특정 문법이 맞는지 틀린지에 대한 논쟁에 대해 어떻게 확인을 할 수 있을까를 느낄 수 있는 간단한 대화부터 소개합니다.

 

질문: "Who is a winner?"

답변: "I think that the Code is a winner!"

 

MS초청 세미나 중에서 MS의 개발 이사의 답변...

 

 class hoo
{
public:
    hoo(void);
    ~hoo(void);
    void *operator new(size_t size)
    {
         return (void *)0x1000;
    }
};

hoo::hoo(void)
{

}

hoo::~hoo(void)
{
}
int main()
{
    hoo *h = new hoo();
    return 0;
}

 그럼 어떨 때 쓸까?

만약, 객체를 할당하고 소멸하는 시간도 아까울 정도의 프로그램을 개발한다고 하자.  그렇다면 미리 충분한 공간을 잡아놓은 뒤에 객체 생성 요청시에 미리 할당된 메모리를 사용한다면 이를 해결할 수 있을 것이다.

아래 자료 참고 - 가비지 켈렉션 하는 구문은 생략했음다.

 

 #include <iostream>
using namespace std;
using std::cout;
using std::endl;
class hoo
{
    static int usage;
    static hoo my_heap[100];
    static int nousage;
    static hoo *garbage[100];
 
    int hoo_id;
 

public:
    hoo(void)
    {
    }
    virtual ~hoo(void)
    {
    }
    void *operator new(size_t size)
    {
         hoo *re = 0;
         if(usage>=100)
         {
               return 0;
   
         }
         re = my_heap+ usage;
         re->hoo_id = usage;
         usage++;
#ifdef _DEBUG
  cout<<usage-1<<"번 객체 생성"<<endl;
  cout<<"현재까지 부여한 총 객체 수"<<usage<<"소멸된 객체 수"<<nousage<<endl;
#endif
  
         return re;
    } 
    void operator delete(void *obj)
    {
         hoo *ph = (hoo *)obj;
         int gap = ph - my_heap;
         if((gap>=0)&&(gap<usage))
         {
              if(ph->hoo_id == gap)
              {
                   garbage[nousage] = ph;
                   nousage++;
#ifdef _DEBUG
 cout<<gap<<"번 객체 소멸"<<endl;
 cout<<"현재까지 부여한 총 객체 수"<<usage<<"소멸된 객체 수"<<nousage<<endl;
#endif
               }
         }
     }
    operator int()
    {
            return hoo_id;
    }
};

int hoo::usage;
hoo hoo::my_heap[100];
int hoo::nousage;
hoo *hoo::garbage[100];


int main()
{
    hoo *hs[10];
    int i = 0;
 
    for(i=0;i<10;i++)
    {
         hs[i] = new hoo();
         cout<<(*hs[i])<<endl;
    }

    delete hs[0];
    delete hs[3];

    delete hs[1];
    delete hs[4];
    delete hs[2];

 
    return 0;
}

*참고로 본 예제에서 5개의 개체를 소멸하지 않았지만 메모리 누수는 없지여...

 

 

사견

    다른 연산자는 사용하는 패턴에 따라 중복정의를 할 필요가 없는 경우가 많아 개발자에 따라 그리 유용성이 높지 않을 수 있겠지만 new(new [])와 delete(delete[])연산자의 경우는 프로그램의 크기와 중요성이 크면 클 수록 유용성이 높다고 생각합니다.

 

 

 

반응형