set_new_handler(0)

2023-05-16

《STL源码剖析》第45页中有一行代码set_new_handler(0):

    inline T* _allocate(ptrdiff_t size, T*)
    {
        std::set_new_handler(0);
        T* tmp = (T*)(::operator new((size_t)(size * sizeof(T))));
        if (tmp == 0)
        {
            std::cerr << "out of memory" << std::endl;
        }
        return tmp;
    }

C++对内存分配的原理:

如果程序员决定用new operator向计算机申请一块内存,那么就可能会遇到内存不够的情况。一旦内存不够申请失败,默认情况下C++会抛出std::bad_alloc异常。但是如果你不想让它抛出异常,而是想自己写一个程序来处理内存不够的情况,就可以用set_new_handler(new_handler),把new_handler指向你写的内存不够的处理程序。这样内存不够了的话C++就会去调用你写的内存不够处理程序,然后再做后续处理。如果你写set_new_handler(0)也就是set_new_handler(nullptr),实际上就是强制C++认为你没有自定义的内存不够处理程序(因为指针是0嘛),所以说当内存不够的时候,C++就会直接抛出std:bad_alloc异常。

总结:

因为在这个例子中是一个模板函数,所以说谁也不知道用户在模板实例化的时候前面有没有给set_new_handler指定什么自定义的内存不够处理函数。所以这个用set_new_handler(0),就是为了强制C++在内存不够的时候抛出std:bad_alloc,而不是去执行什么其他自定义的内存不够处理程序。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

set_new_handler(0) 的相关文章

随机推荐

  • 一招解决 pip 代理问题

    打开 96 控制面板 96 gt 96 网络和Internet 96 勾选这个选项 xff1a 具体原因未知 xff0c 但是有奇效 此后anaconda Navigator等一众无法自动配置代理的工具也畅通无阻
  • IDEA 启动报错could not find main class com/intellij/idea/main解决办法

    1 现象 安装完首次打开 intellij 出现 could not find main class com intellij idea main 2 解决办法 You should create IDEA JDK 64 environme
  • error in pycallgraph setup command: use_2to3 is invalid.

    solution Downgrade setuptools gt 61 58 gt lt 58 pip install setuptools 61 61 57 5 0
  • Linux Ubuntu 安装onedrive 依赖库缺失

    The following packages have unmet dependencies onedrive Depends libphobos2 ldc shared98 gt 61 1 1 28 0 but it is not ins
  • CCF- CSP202112-2序列查询新解 简单分段+满分题解

    CCF CSP202112 2序列查询新解 简单分段 43 满分题解 题目链接 xff1a 202112 2序列查询新解 思路 xff1a 数据最大范围为109 xff0c 因此需要采用long long类型分析样例序列A xff0c 我们
  • 第2章 关系数据库练习题

    一 设有三个关系 xff1a S xff08 sno xff0c sname xff0c age xff0c sex xff09 sc xff08 sno xff0c cno xff0c cname xff09 c xff08 cno xf
  • 数字的逆序输出

    include lt stdio h gt int main 将一个数字逆序输出 printf 34 请输入一个数字 xff1a n 34 int number scanf 34 d 34 amp number printf 34 逆转后的
  • ENSP教程---OSPF单区域配置实验

    目录 一 实验目标 二 拓扑图 三 配置基本环境 四 配置OSPF 五 修改 OSPF hello dead时间参数 七 控制OSPF xff24 R BDR的选举 八 配置信息 一 实验目标 掌握OSPF 中Router ID 的配置方法
  • Java判断回文序列

    经典的回文序列判断问题 xff0c 博主在学数据结构时遇到的一道作业题 xff0c 当时老师让用栈做的 xff0c 将我自己写的程序分享一下 xff1a 题目 xff1a 编写一个程序判别读入的字符序列是否为 回文序列 xff0c 所谓回文
  • 定义一个数组,然后从键盘输入10个整数,编程求出其最大值、最小值以及平均值(C语言)

    本程序使用了定义冒泡排序函数和定义求平均函数的方法 include lt stdio h gt include lt math h gt void Bubblesort int a int len int i j temp for j 61
  • 「Atcoder」abc242 题解

    A T shirt Code span class token keyword void span span class token function solve span span class token punctuation span
  • websocket的reconnecting-websocket的使用

    1 引用 reconnecting websocket js npm i reconnecting span class token operator span websocket 2 建立websocket ts span class t
  • nextcloud+nginx+ssl+非443,踩坑记录

    需求描述 pc 移动端app必须都支持 为了省阿里云服务器流量 xff0c 服务器需要的三个访问路径 1 需要内网可以通过ip 43 port直接访问 2 外网可以通过ddns访问 xff0c 因为443和80端口都被封 xff0c 只能换
  • 【python学习笔记】

    一 基础知识 1 字面量 xff1a 被写下来的固定的值 2 单行注释符 xff1a 单行注释内容 ps xff1a 注释符后要有个空格 3 多行注释 xff1a 34 34 34 多行注释内容 34 34 34 4 查看变量和字面量类型
  • linux命令(包含基础命令和进阶命令)大全

    拷贝 xff1a yy 删除 xff1a dd 末行 xff1a G 首行 xff1a gg 设置行号 xff1a set u 撤销 xff1a u 定位某行 xff1a 行号 shift 43 g 关机 xff1a shutdown ha
  • 汇编语言学习笔记

    一 绪论 所用教材 xff1a 汇编语言第3版 王爽老师 xff0c 清华大学出版社 1 从机器语言到汇编语言 机器语言是机器指令的集合 xff0c 汇编指令是机器指令的助记符 xff0c 汇编指令通过编译器转换成机器可以识别的01机器码
  • 机器学习笔记

    一 绪论 1 监督学习 给定一个数据集 xff0c 且已经表明了 正确答案 1 1回归问题 xff1a 预测一个连续值输出 xff1b 分类问题 xff1a 预测一个离散值输出 2 无监督学习 给定一个未表明意义的数据集 xff0c 将其分
  • C++之 try语句块和异常处理

    一 异常 异常是指存在于代码运行时的反常行为 xff0c 这些反常行为超出了函数正常执行功能的范围 xff0c 异常处理机制包括两部分的协同支持 xff1a 异常检测和异常处理 二 C 43 43 中的异常处理 在c 43 43 语言中 x
  • leetcode166题-分数到小数

    题目来源 xff1a leetcode cn 问题描述 xff1a 给定两个整数 xff0c 分别表示分数的分子 numerator 和分母 denominator xff0c 以 字符串形式返回小数 如果小数部分为循环小数 xff0c 则
  • set_new_handler(0)

    STL源码剖析 第45页中有一行代码set new handler 0 xff09 xff1a inline T allocate ptrdiff t size T std set new handler 0 T tmp 61 T oper