set_new_handler(0)有什么用

 更新时间:2022年08月14日 08:52:17   作者:林夕07  
本文主要介绍了set_new_handler(0)有什么用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

出自《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 menory" << 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,而不是去执行什么其他自定义的内存不够处理程序。所以这里用set_new_handler(0)不是没有用,而是强制C++在内存不够的时候一定要抛出std:bad_alloc异常

总结

set_new_handler(0)主要是为了卸载目前的内存分配异常处理函数,这样就会导致一旦分配内存失败,C++就会强制性抛出std:bad_alloc异常,而不是跑到处理某个异常处理函数去处理。

到此这篇关于set_new_handler(0)有什么用的文章就介绍到这了,更多相关set_new_handler(0)内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现程序开机自启动

    C语言实现程序开机自启动

    本文给大家分享的是一则C语言实现开机自启动的代码,主要是通过C来获取程序路径修改注册表项来实现,有需要的小伙伴可以参考下
    2016-01-01
  • C++实现动态绑定代码分享

    C++实现动态绑定代码分享

    对于C++动态绑定的理解,就是编译器用静态分析的方法加上虚拟函数的设计实现在程序运行时动态智能执行正确虚拟函数的技术。要彻底理解动态绑定,只需要掌握两点,一是编译器的静态编译过程,二是虚拟函数的基本知识。只要有了这两点理解,任何动态绑定的分析都是很容易的
    2015-11-11
  • OpenCV 图像拼接和图像融合的实现

    OpenCV 图像拼接和图像融合的实现

    本文主要介绍了OpenCV 图像拼接和图像融合,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 解析C++哈夫曼树编码和译码的实现

    解析C++哈夫曼树编码和译码的实现

    本篇文章主要介绍了C++哈夫曼树编码和译码的实现,详细的讲诉了哈夫曼树编码的原理,有需要的同学可以了解一下。
    2016-11-11
  • C语言关键字union的定义和使用详解

    C语言关键字union的定义和使用详解

    这篇文章主要介绍了C语言关键字union的定义和使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 使用C语言编写基于TCP协议的Socket通讯程序实例分享

    使用C语言编写基于TCP协议的Socket通讯程序实例分享

    这篇文章主要介绍了使用C语言编写基于TCP协议的Socket通讯程序实例分享,能够实现包括重新连接与每分钟通信一次等的功能,需要的朋友可以参考下
    2016-03-03
  • C语言单链队列的表示与实现实例详解

    C语言单链队列的表示与实现实例详解

    这篇文章主要介绍了C语言单链队列的表示与实现,对于研究数据结构与算法的朋友来说很有参考借鉴价值,需要的朋友可以参考下
    2014-07-07
  • C++实现LeetCode(100.判断相同树)

    C++实现LeetCode(100.判断相同树)

    这篇文章主要介绍了C++实现LeetCode(100.判断相同树),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言对磁盘文件进行快速排序简单实例

    C语言对磁盘文件进行快速排序简单实例

    这篇文章主要介绍了C语言对磁盘文件进行快速排序简单实例的相关资料,需要的朋友可以参考下
    2017-06-06
  • 使用C语言编写钢琴小程序

    使用C语言编写钢琴小程序

    这篇文章主要为大家详细介绍了使用C语言编写钢琴小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02

最新评论