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` 异常,并输出异常信息。

相关推荐
2401_868534787 小时前
RTOS之RT-Thread & Linux:线程/进程管理与调度核心差异分析
c++·python
wabs6667 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing7 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
一米阳光86618 小时前
软考(中级)软件设计师核心笔记(6)系统开发基础——需求分析、系统设计
笔记·职场发展·需求分析·软考·软件设计师·中级职称
郝学胜-神的一滴8 小时前
Qt 高级编程 040:按钮悬浮弹出滑块弹窗的完整攻略
开发语言·c++·qt·软件工程·用户界面
Tongzhi20268 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog8 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
oyguyteggytrrwwwrt10 小时前
自制交叉线路识别算法
算法
手写码匠10 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
晓天衡宇•评测社区11 小时前
FSR-Bench 前沿科学推理榜单发布:GPT-5.5 居首,“会推理”未必“能答对”
算法