????????x??operator new???????

????1????????set_new_handler??????????????x??????????????????x??new-handler??????????new-handler??????????????????У?????"::"?????????????std??????set_new_handler??????????std?????

????2?????????operator new??????檔???????η??????????operator new?????x??new-handler?????????????1.?????????????new-handler????????operator new??δ???????棬?????std::bad_alloc????x??operator new?????????x??operator new?????????????????new-handler????????????????????

????3?????????operator new?????x????????????????? x??operator new????ε?????set_new_handler?????????????????????????????????????????

????c++??????????


void * x::operator new(size_t size)
{
 new_handler globalhandler =  // ???x??new_handler
   
  std::set_new_handler(currenthandler);
 
void *memory;

try {  // ??????????
 memory = ::operator new(size);
}


catch (std::bad_alloc&) {  // ??????new_handler
 std::set_new_handler(globalhandler);     
 throw; // ?????
}
 std::set_new_handler(globalhandler); // ??????new_handler
 return memory;
}

?????????????????????std::set_new_handler????????????μ?????m9??????????

?????????x?????????????????????£?


void nomorememory();// x????????????????????new_handler??????????

x::set_new_handler(nomorememory);
  // ??nomorememory?????x??
  // new-handling????

x *px1 = new x;
  // ????????????
  // ????nomorememory
string *ps = new string;
  // ???????????????????new-handling????
 
x::set_new_handler(0);
  // ??x??new-handling???????
 
x *px2 = new x;
  // ?????????????????????
  // (??x???new-handling????)


??????????????????????????????????????????????????????????????????????????????????????????????41??????????к??????????????????????????????????????????????????????????????????