set_new_handler(0)有什么用

set_new_handlerC++语言提供的一个函数,用于设置一个新的内存分配失败处理程序。当内存分配操作失败时,该处理程序将被调用。当我们在C++程序中使用new操作符申请内存时,如果系统找不到合适的内存块,就会触发内存分配失败,进而导致程序抛出std::bad_alloc异常。

set_new_handler(0)的作用是设置一个新的内存分配失败处理程序为null(0),也就是取消默认的处理程序,取而代之的是在内存分配失败时不做任何处理。这样,程序就不会因为std::bad_alloc异常而崩溃,而是能够继续执行下去,用户可以根据需要选择如何处理内存分配失败的情况。

下面是两条示例说明:

  1. 示例一
#include <iostream>
#include <new>
using namespace std;

void new_handler()
{
    throw bad_alloc();
}

int main()
{
    set_new_handler(new_handler);

    try
    {
        int* p = new int[1000000000];
    }
    catch (const exception& e)
    {
        cout << e.what() << endl;
    }
    return 0;
}

上述代码中,我们设置了一个新的内存分配失败处理程序new_handler,当内存分配失败时,它会抛出一个bad_alloc异常。在main函数中,我们使用new操作符尝试申请一个非常大的内存块,此时内存分配必定失败,从而触发了new_handler。我们通过try-catch机制捕获了抛出的异常,并在屏幕上输出了异常信息:"std::bad_alloc"。

如果我们没有设置新的内存分配失败处理程序,程序会在触发异常后自动结束运行,输出信息如下:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
  1. 示例二
#include <iostream>
#include <new>
using namespace std;

void new_handler()
{
    throw bad_alloc();
}

void func()
{
    int* p = new int[1000000000];
}

int main()
{
    set_new_handler(new_handler);

    try
    {
        func();
    }
    catch (const exception& e)
    {
        cout << e.what() << endl;
    }
    return 0;
}

在这个示例代码中,我们定义了一个名为func的函数,其中申请了一个非常大的内存块。我们在main函数中调用func函数,此时内存分配必定失败,进而触发了new_handler。在try-catch块中,我们捕获了new_handler抛出的异常,并在屏幕上输出了异常信息:"std::bad_alloc"。

这个示例和示例一的主要区别是,示例一在main函数内直接使用new操作符,而示例二在一个函数内部使用new操作符。这说明当我们在程序中使用了多个函数并且这些函数都有内存分配操作时,为了能够正确处理异常并避免程序崩溃,我们应该在每一个函数中设置新的内存分配失败处理程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:set_new_handler(0)有什么用 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • C语言用数组表示法传递一维数组

    当我们需要在函数之间传递一维数组时,可以使用指针或数组表示法。本篇攻略将详细讲解使用数组表示法传递一维数组。 什么是数组表示法? 数组是一组相同类型的元素序列,使用数组表示法是指用指针变量表示数组首元素的地址,通过指针地址访问数组中的元素。 一维数组的数组表示法格式 函数声明时,可以使用以下格式表示使用数组表示法传递一维数组: void function_n…

    C 2023年5月9日
    00
  • ubuntu系统vscodeC++编译环境配置与使用方式

    下面为你详细讲解“ubuntu系统vscodeC++编译环境配置与使用方式”的完整攻略。 一、安装和配置C++编译环境 1. 安装GCC和G++编译器 在终端执行以下命令来安装GCC和G++编译器: sudo apt install build-essential 2. 安装CMake 在终端执行以下命令来安装CMake: sudo apt install …

    C 2023年5月23日
    00
  • 激战2 国服9月12日客户端官方更新文档

    激战2 国服9月12日客户端官方更新文档攻略 更新内容 新增“幻像术”职业技能,可使玩家在战斗中召唤幻像进行攻击或掩护。 强化“元素使”职业技能,增加多种元素精灵形态,提高技能伤害输出。 调整“狂战士”职业技能,降低技能冷却时间,增加爆发输出和生存能力。 优化游戏画面,支持更高分辨率和更流畅的帧率,提高游戏体验。 新增游戏活动“龙族秘宝”,可在游戏中搜寻龙族…

    C 2023年5月22日
    00
  • C语言自定义函数的实现

    C语言中自定义函数的实现可以分为以下几个步骤: 函数声明 : 在使用函数之前,需要先声明函数。函数声明分为两种,一种是函数原型声明,另一种是直接写函数定义。 函数定义:函数定义包括函数名、入参、返回值和函数体。其中函数体是自定义函数的核心部分。 函数调用:调用自定义函数需要使用函数名,并传递相应的参数,等待函数返回相应的结果。 下面,我们用两个示例来说明自定…

    C 2023年5月23日
    00
  • 在PHP语言中使用JSON和将json还原成数组的方法

    接下来我将详细讲解如何在PHP语言中使用JSON以及将JSON还原成数组的方法。 将数组转换成JSON字符串 在PHP中,可以使用json_encode()函数将数组转换成JSON字符串。该函数的语法如下: json_encode(mixed $value, int $options = 0, int $depth = 512): string|false …

    C 2023年5月23日
    00
  • c++中的stack和dequeue解析

    C++中的Stack和Dequeue解析 Stack Stack概述 栈的英文为 stack,它是一种数据结构,特点是后进先出(last in first out,LIFO)。栈有两个基本操作,一个是进栈(也叫压栈,push),一个是出栈(也叫弹栈,pop)。进栈操作会让数据从栈顶进入栈中,而出栈操作会让数据从栈顶弹出。 C++中提供了 stack 模板类,…

    C 2023年5月22日
    00
  • iOS底层探索之自动释放池原理解析

    iOS底层探索之自动释放池原理解析 什么是自动释放池 自动释放池是一种机制,用于在Objective-C中管理内存。具体来说,自动释放池是一个用于暂时存储不需要的Objective-C对象的容器,当自动释放池被销毁时,它所包含的所有对象都被发送一条autorelease消息。autorelease消息会将这些对象的引用计数减一,如果引用计数变为0,对象会立即…

    C 2023年5月23日
    00
  • 使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇

    关于“使用jQuery向ASP.NET MVC传递复杂JSON数据-ModelBinder篇”的完整攻略可以分为以下几个步骤: 1. 创建MVC项目 在开始使用jQuery向ASP.NET MVC传递复杂JSON数据-ModelBinder篇的攻略前,首先需要创建一个MVC项目,可以使用Visual Studio创建。在创建MVC项目时需要选择ASP.NET…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部