//############################################################################
// 自定义new handler
/*
* 1. 什么是
*
* New handler 是当operator new分配内存失败是调用的函数
* 目的是帮助内存分配成功
* set_new_handler() 设置一个new handler并且返回当前的new handler.
*/
void* operator new(std::size_t size) throw(std::bad_alloc) {
while (true) {
void* pMem = malloc(size); // 分配内存
if (pMem)
return pMem; // 成功则返回 new_handler Handler = set_new_handler(0); // 获取new handler
set_new_handler(Handler); if (Handler)
(*Handler)(); // 调用new handler
else
throw bad_alloc(); // 如果new handler为空,抛异常
}
}
/*
* 所以new-handler 必须要做以下事情之一:
* 1). 使更多的内存可用
* 2). 设置一个不同的new-handler
* 3). 卸载new-handler (即传一个null指针)
* 4). 抛出一个bad_alloc异常或者派生类
* 5). 终止程序
*/ int main() {
int *pGiant = new int[10000000000L];
delete[] pGiant;
} OUTPUT:
terminate called after throwing an instance of 'std::bad_alloc' void NoMoreMem() {
std::cerr << "Unable to allocate memory, Bo." << endl;
abort();
}
int main() {
std::set_new_handler(NoMoreMem);
int *pGiant = new int[10000000000L];
delete[] pGiant;
} OUTPUT:
Unable to allocate memory, Bo. /*
* 2. 类专用的new-handler
*/ class dog {
int hair[10000000000L];
std::new_handler origHandler;
public:
static void NoMemForDog() {
std::cerr << "No more memory for doggy, Bo." << endl;
std::set_new_handler(origHandler); // 抛异常之前把handler还原成老的
throw std::bad_alloc;
}
void* operator new(std::size_t size) throw(std::bad_alloc) {
origHandler = std::set_new_handler(NoMemForDog); //替换handler,保存老的handler
void* pV = ::operator new(size); // 调用全局的operator new
std::set_new_handler(origHandler); // 恢复老的handler
return pV;
}
}; int main() {
std::tr1::shared_ptr<dog> pd(new dog());
...
}

C++进阶--自定义new handler的更多相关文章

  1. Python 日志打印之自定义logger handler

    日志打印之自定义logger handler By:授客 QQ:1033553122 #实践环境 WIN 10 Python 3.6.5 #实践代码 handler.py #!/usr/bin/env ...

  2. 微软企业库5.0 学习之路——第九步、使用PolicyInjection模块进行AOP—PART4——建立自定义Call Handler实现用户操作日志记录

    在前面的Part3中, 我介绍Policy Injection模块中内置的Call Handler的使用方法,今天则继续介绍Call Handler——Custom Call Handler,通过建立 ...

  3. SpringMVC自定义兼容性Handler

    写在前面 看到这篇博客时,默认你知道Spring MVC中handler的作用,及前台请求到响应的的流转. 感谢网上其他大佬博客给我的借鉴,博客地址这里忘记了. 自定义Handler 我有时候会考虑是 ...

  4. python自定义logger handler

    _filefmt=os.path.join("logs","%Y-%m-%d.log") class MyLoggerHandler(logging.Handl ...

  5. .NetCore下使用Prometheus实现系统监控和警报 (五)进阶自定义收集指标 之 Counter

    Prometheus下面定了四种类型的收集方式,下面我们主要来来说下Counter的使用 Nuget导入Prometheus.AspNetCore包 下面先来看下我的Prometheus配置,这里我没 ...

  6. Android控件进阶-自定义流式布局和热门标签控件

    技术:Android+java   概述 在日常的app使用中,我们会在android 的app中看见 热门标签等自动换行的流式布局,今天,我们就来看看如何 自定义一个类似热门标签那样的流式布局吧,类 ...

  7. Android 进阶自定义 ViewGroup 自定义布局

    前言 在我们的实际应用中, 经常需要用到自定义控件,比如自定义圆形头像,自定义计步器等等.但有时我们不仅需要自定义控件,举个例子,FloatingActionButton 大家都很常用,所以大家也很经 ...

  8. Android开发进阶——自定义View的使用及其原理探索

    在Android开发中,系统提供给我们的UI控件是有限的,当我们需要使用一些特殊的控件的时候,只靠系统提供的控件,可能无法达到我们想要的效果,这时,就需要我们自定义一些控件,来完成我们想要的效果了.下 ...

  9. iOS开发进阶 - 自定义UICollectionViewLayout实现瀑布流布局

    移动端访问不佳,请访问我的个人博客 最近项目中需要用到瀑布流的效果,但是用UICollectionViewFlowLayout又达不到效果,自己动手写了一个瀑布流的layout,下面是我的心路路程 先 ...

随机推荐

  1. Gym-101673 :East Central North America Regional Contest (ECNA 2017)(寒假自训第8场)

    A .Abstract Art 题意:求多个多边形的面积并. 思路:模板题. #include<bits/stdc++.h> using namespace std; typedef lo ...

  2. lame定理求欧几里得算法的求余和赋值次数

    根据lame定理,根据欧几里得算法求(a,b)的最大公因数过程如下(假设a>b):

  3. 20155208 2016-2017-2 《Java程序设计》课程总结

    20155208 2016-2017-2 <Java程序设计>课程总结 一.每周作业及实验报告链接汇总 一路无悔 感恩有你(预备作业一):浅谈师生关系及对java学习的期望. 精益求精,从 ...

  4. 自我复制的3D打印机

    RepRap 是人类历史上第一部可以自我复制型的机器. https://reprap.org/wiki/RepRap RepRap 是一部可以生成塑料实物的免费桌面型 3D 打印机.由于 RepRap ...

  5. ApplicationContext之getBean方法详解

    转自:http://www.sohu.com/a/115194552_466964 我们知道可以通过ApplicationContext的getBean方法来获取Spring容器中已初始化的bean. ...

  6. ios-邮箱正则表达式判断

    - (void)loadData { NSMutableArray *array = [NSMutableArray arrayWithCapacity:10]; if ([self.title is ...

  7. centos7设置grub密码保护

    设置grub密码保护:查看grub登录用户名cat /etc/grub.d/01_users,可以看到用户名为root.通过grub2-setpasswords设置grub密码,确认密码 cat /b ...

  8. JDBC面试题

    关于jdbc的面试题 什么是JDBC,在什么时候会用到它? JDBC的全称是Java DataBase Connection,也就是Java数据库连接,我们可以用它来操作关系型数据库.JDBC接口及相 ...

  9. System类的使用

    1.System类: 不能被实例化,调用方式:  System.方法 2.用于计算程序执行的时间,currentTimeMillis()方法 System.currentTimeMillis(): p ...

  10. ClusterControl 强大免费数据管理工具

    几张参考图 galera 集群管理 多种数据库管理 组件架构 参考资料 https://severalnines.com/docs/intro.html