언어 자료구조 알고리즘/C언어 예제

new 연산자 오버로딩

언제나휴일 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[])연산자의 경우는 프로그램의 크기와 중요성이 크면 클 수록 유용성이 높다고 생각합니다.

 

 

 

반응형

'언어 자료구조 알고리즘 > C언어 예제' 카테고리의 다른 글

적분 공식을 이용하여 파이 구하기  (0) 2009.08.19
Visual C++ 표준 라이브러리 헤더파일  (0) 2009.08.19
singed 와 unsigned  (1) 2009.08.19
16진수와 2진수 사이의 변환  (0) 2009.08.19
파서트리  (0) 2009.08.19
퀵소트  (0) 2009.08.19
선택정렬  (0) 2009.08.19
삽입정렬  (0) 2009.08.19
정보 올림피아드  (0) 2009.08.19
중복되지 않게 랜덤한 카드 발생  (0) 2009.08.19