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++ 异常处理 catch(…)介绍

    C++ 异常处理 catch(…)介绍 异常处理简介 在 C++ 中,异常处理是一种用于处理程序运行期间发生的意外情况(比如算术错误、空指针等)的一种机制。当程序检测到异常情况时,它会抛出一个异常,这个异常会被 C++ 运行时库捕获并进行处理。异常处理机制可以让程序避免崩溃,更加稳定。 C++ 中的异常处理涉及三个关键字:throw、try 和 catc…

    C 2023年5月22日
    00
  • C语言开发中的常见错误详解

    C语言开发中的常见错误详解 引言 C语言是一门广泛应用于操作系统、网络、嵌入式等领域的高级编程语言。由于C语言灵活、高效、可移植的特点,成为了常见的编程语言之一。但是,由于C语言需要手动管理内存,特别容易出现各种内存错误。本篇文章将详细讲解C语言开发中常见的错误。 常见错误及解决方案 1. 数组越界 当访问数组时,若访问的索引值大于数组的边界值,则很容易出现…

    C 2023年5月23日
    00
  • C语言实现五子棋游戏

    C语言实现五子棋游戏攻略 1. 五子棋游戏基本规则 五子棋是一种双人对弈的纯策略型棋类游戏,在棋盘上摆放黑白两色的棋子,先在横向、竖向或斜向连续形成五子棋者获胜。棋盘通常为15×15的方格,也有其他规格的棋盘。 2. 实现五子棋游戏的基本思路 实现五子棋游戏的基本思路是通过使用二维数组作为游戏棋盘,使用循环检查棋盘上落子的情况,判断游戏的胜负情况。 具体步骤…

    C 2023年5月23日
    00
  • C++实现闹钟程序的方法

    下面我来详细讲解一下 C++ 实现闹钟程序的方法。 一、实现思路 要实现闹钟程序,就需要先了解一下闹钟程序的基本功能:1)设置闹钟时间;2)定时器到时后发出提示音;3)停止提示音。根据这些功能,我们可以分解出以下几个步骤: 读取用户设置的闹钟时间; 判断当前时间是否等于闹钟时间,如果不等待,则继续等待; 定时器到时后,播放提示音; 用户选择关闭提示音或延迟提…

    C 2023年5月23日
    00
  • Java EE项目中的异常处理总结(一篇不得不看的文章)

    以下是我对《Java EE项目中的异常处理总结(一篇不得不看的文章)》这篇文章的完整攻略: 文章概述 文章主要分为四个部分:异常处理的基本概念、Java中的异常处理机制、Java EE项目中的异常处理、异常处理的最佳实践等。其中,第一个部分主要介绍了异常处理的基本概念,包括异常的定义、分类、抛出和捕获等。第二个部分则详细讲解了Java中的异常处理机制,包括t…

    C 2023年5月23日
    00
  • STL 的string类怎么啦

    下面我将为您详细讲解STL的string类的使用方法: STL的string类 string类是STL中的一个重要组件,它是一个可变长度的字符串容器,支持字符串的插入、删除、查找、替换等操作。可以通过#include <string>来包含string类的头文件。 创建string对象 我们可以通过多种方式来创建string对象。比如: // 创…

    C 2023年5月23日
    00
  • 详解基于C++实现约瑟夫环问题的三种解法

    详解基于C++实现约瑟夫环问题的三种解法 约瑟夫问题 约瑟夫问题是一个经典的问题,是一个圆圈里面有$n$个数字,从中每次删除第$m$个数字,求出每次删除的数字。简单的说,约瑟夫问题就是$n$个人围成一圈,从第一个人开始报数,报到$m$的人出圈,直到计算到最后一个人。 解法一:使用递推(模拟游戏过程) 思路:利用递归的思想模拟即可。假如最后剩下一个数据,则保留…

    C 2023年5月22日
    00
  • 盘点2016上半年十大APT神秘黑客组织

    盘点2016上半年十大APT神秘黑客组织 1. 菜鸟组织(Rookie Group) 菜鸟组织是一支来自中国的APT黑客组织,主要针对亚洲国家的政府机构、军队及科技公司进行攻击。他们经常使用钓鱼邮件和恶意附件来传播恶意软件,攻击手法比较简单。因此,这个组织通常会结合大规模攻击,以期望入侵的成功率能相对增加。 示例一:2016年5月,菜鸟组织通过一系列的攻击,…

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