了解set_new_handler函数

本文介绍了std::new_handler,它是一种函数指针类型,用于std::set_new_handler和std::get_new_handler函数。当内存分配失败时,默认分配函数会调用new_handler函数,其功能包括分配更多内存、中断程序或抛出异常。还给出了使用示例,展示了内存分配失败时的处理情况。

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

1. 定义

std::new_handler set_new_handler( std::new_handler new_p ) throw();
     将new_p设置为new_handler 函数,介绍一下std::new_handler。
typedef void (*new_handler)();
    std::new_handler是函数指针类型:指针指向没有入参并且返回值为void类型的函数。用于std::set_new_handler函数和std::get_new_handler函数。
    new_handler函数:当分配内存失败时,会通过默认的分配函数(new和new[])调用。如果new分配空间失败,会反复调用这个new_handler函数直到内存分配成功,或者直到new_handler函数不返回或被替换。在第一次调用new_handler函数之前,如果new_p是个空指针,默认的分配函数直接throw bad_alloc。
 new-handler函数的三个功能:
 1) 分配更多的内存空间
 2) 中断程序;
 3) throw异常类型bad_alloc
默认操作throw std::bad_alloc,用户可以生成自己的new-handler函数;
set_new_handler(0)主要是为了卸载目前的内存分配异常处理函数,一旦分配内存失败的话,C++就会强制性抛出std:bad_alloc异常。
2. 例子
#include <iostream>
#include <new>
 
void handler()
{
    std::cout << "Memory allocation failed, terminating\n";
    std::set_new_handler(nullptr);
}
 
int main()
{
    std::set_new_handler(handler);
    try {
        while (true) {
            new int[100000000ul];
        }
    } catch (const std::bad_alloc& e) {
        std::cout << e.what() << '\n';
    }
}
new[]时调用new_handler函数,如果分配成功直接返回,如果失败调用handler函数,如例子set_new_handler(nullptr)直接throw bad_alloc一个异常。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值