5. 객체의 클래스 타입에 따른 new 처리자 구현
#include <iostream>
using namespace std;
#define SIZE 499999999L
class NewHandlerHolder
{
public:
explicit NewHandlerHolder(new_handler nh)
: handler(nh)
{
}
~NewHandlerHolder()
{
std::set_new_handler(handler);
}
private:
std::new_handler handler;
NewHandlerHolder(const NewHandlerHolder &) = delete;
NewHandlerHolder &operator=(const NewHandlerHolder &) = delete;
};
class Widget
{
public:
static std::new_handler SetNewHandler(std::new_handler p) throw()
{
new_handler oldHandler = currentHandler;
currentHandler = p;
return oldHandler;
}
static void *operator new(size_t size) throw(bad_alloc)
{
std::new_handler nh = std::set_new_handler(currentHandler);
NewHandlerHolder h(nh);
return ::operator new(size);
}
private:
static std::new_handler currentHandler;
int arr[SIZE];
};
std::new_handler Widget::currentHandler = nullptr;
void OutOfMem()
{
cerr << "Widget 할당 에러" << endl;
throw std::bad_alloc();
}
void OutOfMemDefault()
{
cerr << "일반적인 할당 에러" << endl;
throw std::bad_alloc();
}
int main()
{
std::set_new_handler(OutOfMemDefault);
Widget::SetNewHandler(OutOfMem);
try
{
Widget *w = new Widget();
}
catch (std::exception ex)
{
cout << ex.what() << endl;
}
try
{
int *arr = new int[SIZE];
}
catch (std::exception ex)
{
cout << ex.what() << endl;
}
}
출력

6. 클래스 템플릿을 활용한 일반화된 new 처리자 클래스 구현
#include <iostream>
using namespace std;
#define SIZE 499999999L
class NewHandlerHolder
{
public:
explicit NewHandlerHolder(new_handler nh)
: handler(nh)
{ }
~NewHandlerHolder()
{
std::set_new_handler(handler);
}
private:
std::new_handler handler;
NewHandlerHolder(const NewHandlerHolder&) = delete;
NewHandlerHolder& operator=(const NewHandlerHolder&) = delete;
};
template<typename T>
class NewHandlerSupport
{
public:
static std::new_handler SetNewHandler(std::new_handler p) throw()
{
std::new_handler oldHandler = currentHandler;
currentHandler = p;
return oldHandler;
}
static void* operator new(size_t size) throw(bad_alloc)
{
NewHandlerHolder h(std::set_new_handler(currentHandler));
return ::operator new(size);
}
private:
static std::new_handler currentHandler;
};
template<typename T>
std::new_handler NewHandlerSupport<T>::currentHandler = nullptr;
class Widget : public NewHandlerSupport<Widget>
{
private:
int arr[SIZE];
};
void OutOfMem()
{
cerr << "Widget 할당 에러" << endl;
throw std::bad_alloc();
}
void OutOfMemDefault()
{
cerr << "일반적인 할당 에러" << endl;
throw std::bad_alloc();
}
int main()
{
std::set_new_handler(OutOfMemDefault);
Widget::SetNewHandler(OutOfMem);
try
{
Widget* w = new Widget();
}
catch (std::exception ex)
{
cout << ex.what() << endl;
}
try
{
int* arr = new int[SIZE];
}
catch (std::exception ex)
{
cout << ex.what() << endl;
}
}