STL源码阅读笔记(2)——set_new_handler

`set_new_handler` 是 C++ 标准库中定义的一个函数,用于设置新的内存分配失败处理程序。这个处理程序在使用 `operator new` 分配内存失败时被调用。`set_new_handler` 允许程序员提供一个回调函数,当内存分配失败时,这个回调函数会被调用,以便程序可以尝试采取一些补救措施(例如释放一些资源或者记录日志),而不是直接抛出 `std::bad_alloc` 异常。

下面是 `set_new_handler` 的基本用法和解释:

cpp 复制代码
std::new_handler set_new_handler(std::new_handler new_p) noexcept;
- `new_p`:这是一个指向新的内存分配失败处理程序的指针,该处理程序是一个没有参数和返回值的函数。
- 返回值:函数返回之前设置的内存分配失败处理程序的指针。

举例如下:

cpp 复制代码
#include <iostream>
#include <new> // 包含 set_new_handler 的头文件

// 自定义的内存分配失败处理程序
void my_new_handler() {
    std::cerr << "Memory allocation failed. Trying to free up resources..." << std::endl;
    // 尝试释放资源或采取其他措施
    // ...
    // 如果无法解决问题,可以抛出异常或终止程序
    throw std::bad_alloc(); // 重新抛出 std::bad_alloc 异常
}

int main() {
    // 设置自定义的内存分配失败处理程序
    std::set_new_handler(my_new_handler);

    try {
        // 尝试分配大量内存,故意导致分配失败
        int* p = new int[1000000000000L];
    } catch (const std::bad_alloc& e) {
        std::cerr << "Caught exception: " << e.what() << std::endl;
    }

    return 0;
}
  1. 包含头文件:`#include <new>` 头文件包含了 `set_new_handler` 的声明。

  2. 自定义处理程序:`my_new_handler` 是一个没有参数和返回值的函数,当内存分配失败时将被调用。

  3. 设置处理程序:在 `main` 函数中,通过 `std::set_new_handler(my_new_handler)` 设置新的内存分配失败处理程序。

  4. 内存分配:尝试分配大量内存以触发内存分配失败,从而调用自定义的处理程序。

  5. 异常处理:捕获 `std::bad_alloc` 异常,并输出异常信息。

相关推荐
码匠许师傅11 分钟前
【C++三方组件】OpenCV:计算机视觉的事实标准
c++
C^h9 小时前
c++ string
开发语言·c++
sbjdhjd9 小时前
网工进阶笔记:H3CSE 园区网全栈技术与协议汇总
网络·笔记·云计算·ssh·网络工程·vlan·aaa
raindayinrain10 小时前
c++高性能--原子操作,无锁编程,操作顺序
开发语言·c++·性能优化
学逆向的10 小时前
C++ 合并命名空间
开发语言·c++·网络安全
Zhao-Jichao10 小时前
VS2026 打包 C++ 程序生成 EXE,借助 Installer Project 扩展工具
开发语言·c++
小徐不徐说11 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
大都督会赢的11 小时前
C++第一节课
开发语言·c++
UIU11411 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场12 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算