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

相关推荐
休息一下接着来5 小时前
C++ 设计模式:Pimpl(Pointer to Implementation)
c++·算法·设计模式
苦藤新鸡5 小时前
18.矩阵同行同列全置零
数据结构·c++·算法·力扣
副露のmagic5 小时前
更弱智的算法学习 day48
学习·算法
汽车仪器仪表相关领域5 小时前
双组分精准快检,汽修年检利器:MEXA-324M汽车尾气测量仪项目实战全解
大数据·人工智能·功能测试·测试工具·算法·机器学习·压力测试
赫凯6 小时前
【强化学习】第六章 Dyna-Q 算法
算法
程序员-King.6 小时前
day154—回溯—分割回文串(LeetCode-131)
算法·leetcode·深度优先·回溯
程序员-King.6 小时前
day155—回溯—组合(LeetCode-77)
算法·leetcode·回溯
DO_Community6 小时前
技术解码:Character.ai 如何实现大模型实时推理性能 2 倍提升
人工智能·算法·llm·aigc·moe·aiter
leo__5206 小时前
基于A星算法的MATLAB路径规划实现
人工智能·算法·matlab
程序员-King.6 小时前
day152—回溯—电话号码的字母组合(LeetCode-17)
算法·leetcode·深度优先·递归