std::set_new_handler 用于若是 new 失败就调用此函数;函数
int * gmem = 0; void outofmem() { std::cerr << "mem alloc failed" << endl; Sleep(500); //稍微睡一下,否则中止调式按钮都没反映啦 } int main(int argc, char *argv[]) { enum { Chunk = 1024 * 1024 * 8 }; std::set_new_handler(outofmem); gmem = new int[100000000000 * Chunk]; //一旦失败调用outofmem. 不断的调用 return 0; }
只要new 失败则一直调用此函数 , 直到有足够的内存为止, 意图在让你去释放一些内存;code
set_new_handler(0); 用来还原内存
若是有需求通常写一个父类去实现:class
class MemHandler{ //用于还原handler public: MemHandler(std::new_handler handler) :handler(handler){} ~MemHandler(){ std::set_new_handler(handler);} private: MemHandler(const MemHandler &) ; MemHandler & operator = (const MemHandler &); std::new_handler handler; }; //也能够把此类写成 template <typename T> class NewHandlerBaseClass{ public: static std::new_handler setNewHandler(std::new_handler newhandler) throw() { std::new_handler old_hanlder = m_handler; m_handler = newhandler; return old_hanlder; } //重载一个 static void * operator new (std::size_t size) throw (std::bad_alloc){ MemHandler memhandler(std::set_new_handler(m_handler)); //设置handler return ::operator new(size); //仍是调用原来的new } private: static std::new_handler m_handler; }; //若是上面的类是模版的话 . 每一个类都有一个独立的static m_handler; class XClass : public NewHandlerBaseClass<XClass> { .... };