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 |