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

相关推荐
全干engineer1 小时前
web3-基于贝尔曼福特算法(Bellman-Ford )与 SMT 的 Web3 DeFi 套利策略研究
算法·金融·web3·去中心化·区块链·智能合约
委婉待续1 小时前
Qt的学习(二)
c++·qt
Splendid1 小时前
Geneformer:基于Transformer的基因表达预测深度学习模型
javascript·算法
愿所愿皆可成1 小时前
机器学习之聚类Kmeans算法
算法·机器学习·kmeans·聚类
幻奏岚音1 小时前
统计学(第8版)——假设检验学习笔记(考试用)
笔记·学习·算法
nenchoumi31192 小时前
UE5 学习系列(一)创建一个游戏工程
c++·学习·游戏·ue5
泽韦德2 小时前
【Redis】笔记|第10节|京东HotKey实现多级缓存架构
redis·笔记·缓存
hie988942 小时前
基于matlab策略迭代和值迭代法的动态规划
算法·动态规划
Coovally AI模型快速验证2 小时前
SFTrack:面向警务无人机的自适应多目标跟踪算法——突破小尺度高速运动目标的追踪瓶颈
人工智能·神经网络·算法·yolo·计算机视觉·目标跟踪·无人机
Brduino脑机接口技术答疑2 小时前
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
人工智能·算法·脑机接口·新手入门