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 失败则一直调用此函数 , 直到有足够的内存为止, 意图在让你去释放一些内存;
set_new_handler(0); 用来还原
如果有需求一般写一个父类去实现:
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>
{
....
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。