//############################################################################
// 自定义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. 在Maven项目中,指定使用阿里云仓库下载jar包

    Maven项目中,在pom.xml的</project>标签之前加入一下标签,指定使用阿里云仓库下载jar包. <!-- 使用aliyun maven --> <repo ...

  2. indexedDB为何物

    https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API 在前一个阶段的工作中,项目组要开发一个平台,为了做出更好的用户体验,实现快 ...

  3. Docker第一个应用:Hello World

    Docker应用:Hello World 前言: 最近学习了Docker相关技术点,国内关于Docker的资料大多是基于Linux系统的,但是我对Linux又不熟(实际上没用过,掩面哭笑.Jpg). ...

  4. 20165313 《Java程序设计》第七周学习总结

    教材学习总结 1.下载安装MySQL数据库管理系统. 2.MySQL数据库基本操作. 3.利用JAVA程序对MySQL数据库系统进行查找,更新,添加和删除操作. 学习中的问题与解决方案 1.运行书上安 ...

  5. switch语句和switch-case与if-else之间的转换

    switch语句格式:switch(变量){case 常量1:语句1;break;case 常量2:语句2;break;......default:语句;break;}特点:1.根据变量的值,选择相应 ...

  6. stm32l071cbt6片内flash操作

    今天在看片内flash的操作,发现按照下面的操作并没有写成功: unsigned long temp = 0x12345678; HAL_FLASH_Unlock(); FLASH_PageErase ...

  7. <jsp:include>动作元素,附:最易出错的一点

    先定义一个date.jsp,再定义一个main.jsp.用<jsp:include plage = "相对url地址" flush = "true"> ...

  8. 【spring源码分析】BeanDefinitionRegistryPostProcessor解析

    一.自定义BeanDefinitionRegistryPostProcessor BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProces ...

  9. Mybatis二(高级部分)

    1.输入映射和输出映射 a)        输入参数映射 b)        返回值映射 2.动态sql a)        If标签 b)        Where标签 c)        Sql片 ...

  10. eclipse操作(备忘)

    myecplise破解   https://blog.csdn.net/by_xiaobai007/article/details/81177367 1.查看类路径 2.建立模板 window--pr ...