1,处理operator new内存分配失败的情况<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> #include<iostream>usingnamespacestd;template<typenameT>classnewhandlersupport{//提供类set_new_handler支持的基类public:staticnew_handlerset_new_handler(new_handlerp);staticvoid*operatornew(size_tsize);//重载operatornew运算符private:staticnew_handlercurrenthandler;//当前的new_handler};template<typenameT>new_handlernewhandlersupport<T>::set_new_handler(new_handlerp){new_handleroldhandler=currenthandler;currenthandler=p;returnoldhandler;}template<typenameT>void*newhandlersupport<T>::operatornew(size_tsize){new_handlerglobalhandler=std::set_new_handler(currenthandler);//申请内存前先设置新的new_Handlervoid*memory;try{memory=::operatornew(size);//实际分配内存}catch(std::bad_alloc&){std::set_new_handler(globalhandler);//恢复旧的new_handlerthrow;//抛出异常}std::set_new_handler(globalhandler);returnmemory;}template<typenameT>new_handlernewhandlersupport<T>::currenthandler=NULL;classGamePlayer:publicnewhandlersupport<GamePlayer>{private:staticconstintNUM_TURNS;int*scores;public:GamePlayer();~GamePlayer();};constintGamePlayer::NUM_TURNS=5;GamePlayer::GamePlayer(){cout<<"构造函数"<<endl;scores=newint[NUM_TURNS];memset(scores,0,sizeof(scores));for(inti=0;i<NUM_TURNS;++i){scores[i]=i;}}GamePlayer::~GamePlayer(){cout<<"析构函数"<<endl;for(inti=0;i<NUM_TURNS;++i){cout<<scores[i]<<'/t';}cout<<endl;delete[]scores;scores=NULL;}voidnomorememory(){cerr<<"unabletosatisfyrequestformemory/n";abort();}intmain(){::set_new_handler(nomorememory);GamePlayer::set_new_handler(nomorememory);GamePlayer*pPlayOne=newGamePlayer();deletepPlayOne;GamePlayer::set_new_handler(NULL);try{GamePlayer*pPlayTwo=newGamePlayer();deletepPlayTwo;}catch(std::bad_alloc&){cerr<<"operatornewfailed"<<endl;}system("pause");return0;}