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_8920709810 小时前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
yuzhuanhei10 小时前
Visual Studio 配置C++opencv
c++·学习·visual studio
小O的算法实验室10 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
一轮弯弯的明月10 小时前
贝尔数求集合划分方案总数
java·笔记·蓝桥杯·学习心得
不爱吃炸鸡柳11 小时前
C++ STL list 超详细解析:从接口使用到模拟实现
开发语言·c++·list
十五年专注C++开发11 小时前
RTTR: 一款MIT 协议开源的 C++ 运行时反射库
开发语言·c++·反射
‎ദ്ദിᵔ.˛.ᵔ₎11 小时前
STL 栈 队列
开发语言·c++
2401_8920709811 小时前
【Linux C++ 日志系统实战】高性能文件写入 AppendFile 核心方法解析
linux·c++·日志系统·文件写对象
郭涤生11 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
航Hang*11 小时前
第3章:Linux系统安全管理——第2节:部署代理服务
linux·运维·服务器·开发语言·笔记·系统安全