set_new_handler

本文探讨了C++中std::set_new_handler的使用,当new操作失败时调用自定义函数处理内存不足的情况,通过示例展示了如何设置和使用new_handler,以及如何创建一个基类来管理和还原handler。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>
{
    ....
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值