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>
{
    ....
};

dashoumeixi
15 声望1 粉丝