using namespace std;
void outOfMem()
{
cerr << "Unable to satisfy request for memory\n";
abort();
}
class LargeObj
{
public:
LargeObj(){ cout<<"I am the large object constructor!"<<endl;}
};
class Widget {
public:
Widget(){ cout<<"I am the Widget constructor!"<<endl;}
static new_handler set_new_handler(new_handler p) throw();
static void * operator new(size_t size) throw(bad_alloc);
private:
static new_handler currentHandler;
};
new_handler Widget::currentHandler = 0;
// init to null in the class impl. file
new_handler Widget::set_new_handler(new_handler p) throw()
{
new_handler oldHandler = currentHandler;
currentHandler = p;
cout<<"I am set_new_handler func!"<<endl;
return oldHandler;
}
class NewHandlerHolder {
public:
explicit NewHandlerHolder(new_handler nh) // acquire current
:handler(nh) {} // new-handler
~NewHandlerHolder() // release it
{
cout<<endl<<" ~NewHandlerHolder()"<<endl;
set_new_handler(handler);
}
private:
new_handler handler; // remember it
NewHandlerHolder(const NewHandlerHolder&); // prevent copying
NewHandlerHolder& operator=(const NewHandlerHolder&); // (see Item 14)
};
void * Widget::operator new(size_t size) throw(bad_alloc)
{
NewHandlerHolder h(set_new_handler(currentHandler)); // install Widget's new-handler
return ::operator new(size); // allocate memory or throw restore global new-handler
}
int main()
{
cout<<endl<<"void outOfMem(); "<<endl;
void outOfMem(); // decl. of func. to call if mem. alloc.
// for Widget objects fails
cout<<endl<<"Widget::set_new_handler(outOfMem); "<<endl;
Widget::set_new_handler(outOfMem); // set outOfMem as Widget's
// new-handling function
cout<<endl<<"Widget *pw1 = new Widget; "<<endl;
Widget *pw1 = new Widget; // if memory allocation
// fails, call outOfMem
cout<<endl<<"string *ps = new string;"<<endl;
string *ps = new string; // if memory allocation fails,
// call the global new-handling
// function (if there is one)
cout<<endl<<"Widget::set_new_handler(0); "<<endl;
Widget::set_new_handler(0); // set the Widget-specific
// new-handling function to
// nothing (i.e., null)
cout<<endl<<"Widget *pw2 = new Widget; "<<endl;
Widget *pw2 = new Widget; // if mem. alloc. fails, throw an
// exception immediately. (There is
// no new- handling function for
// class Widget.)
cout<<"press enter to exit!"<<endl;
cin.get();
return 0;
}
#include<iostream>