달력

5

« 2024/5 »

  • 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
2012. 10. 1. 15:45

c++ operator new c++2012. 10. 1. 15:45

template<typename T>

class NewhandlerSurpport{

public:

static std::new_handler set_new_handler(std::new_handler p) throw();

static void *operator new(std::size_t size) throw(std::bad_alloc);


//new overloading 버전들

private:

static std::new_handler currentHandler;

};


//타입매개변수가 Widget인데 클래스가 Widget이다. 어색어색

//"신기하게 반복되는 패턴"으로 불림

class Widget : NewHandlerSurpport<Widget>{


public:

//static std::new_handler set_new_handler(std::new_handler p) throw();

//static void *operator new(std::size_t size) throw(std::bad_alloc);


private:

static std::new_handler currentHandler;


};


std:;new_handler Widget::set_new_handler(std::new_handler p) throw()

{

std::new_handler oldHandler = currentHandler;

currentHandler = p;

return oldHandler;

}


class NewHandlerHodler{


public:

explicit NewHandlerHolder(std::new_handler nh)

:handler(nh){}


~NewHandlerHolder(){ std::set_new_handler(handler);}

private:

std::new_handler handler;

NewHandlerHolder(const NewHandlerHolder& );

NewHandlerHodler& operator=(const NewHandlerHolder&);


};


void* Widget::operator new(std::size_t size) throw(std::bad_alloc)

{

NewHandlerHolder h(std::set_new_handler(currentHandler));


return ::operator new(size);

};


int main()

{

Widget *p1 = new Widget; //할당이 실패하면 bad_alloc을 던짐


if(p1 == 0); //실패


Widget *p2 = new (std::nothrow) Widget; //할당이 실패하면 널을 던짐


if(p2 == 0);


return 0;

}


set_new_handler함수를 쓰면 메모리할당 요청이 만족되지 못했을 때 호출되는 함수로 지정할 수 있다.

예외불가(nothrow) new 영향력이 제한되어 진다. 메모리 할당 자체에만 적용되기 때문이다. 이후에 호출되는 생성자에 대해서는 얼마든지 예외를 던질 수 있다.


operator new operator delete를 왜 바꾸고 싶을까?

1. 잘못된 힙 사용을 탐지하기 위해

2. 효율을 향상 : operator new, operator delete는 대체적으로 일반적인 쓰임새에 맞추어 설계된 것

자신이 구현할 프로그램의 메모리 Context를 알고 operator new, operator delete를 구현하면 성능향상이 일어날 가능성이 큼

3. 동적 할당 메모리의 실제 사용에 관한 통계 정보를 수집하기 위해


'c++' 카테고리의 다른 글

c++ static 변수 선언 및 정의  (0) 2012.11.28
c++ 특성정보  (0) 2012.09.28
template C++  (0) 2012.09.27
c++ quiz4  (0) 2012.09.27
c++ quiz3  (0) 2012.09.27
:
Posted by НooпeУ


Code Start Code End