//############################################################################
// 自定义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 - 101002H: Jewel Thief (背包,分组,DP决策单调性)

    pro:给定N,M.输入N个物品,(si,vi)表示第i个物品体积为si,价值为vi,s<=300,vi<=1e9: N<1e6:现在要求,对于背包体积为1到M时,求出最大背包价值. ...

  2. 20155219--pwd指令的简单实现

    pwd指令的简单实现 pwd命令作用 Linux中用** pwd **命令来查看"当前工作目录"的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确 ...

  3. sudo命令 和限制root 远程登陆

    1.对sudo命令的配制,输入 visudo 然后,找到92行进行以下配制 以下就是效果 比如: 如果要同时给两个普通用户设置这样子的权限,就可以用另一种方式,下面这种方式不可取的 而是用这种 效果如 ...

  4. error: ld returned 1 exit status 解决

    1.程序未结束运行 2.全局变量冲突,不是宏定义冲突

  5. ODOO v10.0 自动生成财务凭证的科目设置

    ODOO v10.0 自动生成财务凭证的科目设置 可以在产品类别及产品档案里设置,建议在产品类别下设置,方便维护. 项目 设置为(具体科目以公司科目表为主) 对应作用业务 Income Account ...

  6. git使用之放弃本地修改

    一,未使用 git add 缓存代码时. 可以使用 git checkout  --  filepathname (比如: git checkout -- readme.md ,不要忘记中间的 “-- ...

  7. day08 MapReduce

    PS: HDFS对于MapReduce来说,HDFS就是一个就是一个客户端. PS: 离线就是 写sql,sparkh还是写sql 1. MAPREDUCE原理篇(1) Mapreduce是一个分布式 ...

  8. zabbix使用自定义key进行监控

    我的zabbix-server是安装在另一台虚拟机上的,用来监控下图中的这台虚拟机 先修改zabbix的客户端配置文件,增加UserParameter那行,这里我只是用来测试,所以就随便起了一个名为p ...

  9. 推荐一些好的linux学习网站

    菜鸟教程:这个网站有jsp,php,c,android等等入门教程,很适合入门的新手和想多学一门语言的人 传送门http://www.runoob.com/ linux命令那么多,怎么记,给一个lin ...

  10. scala函数等号省略

    例1: 此时没有写返回值,但是有等号,函数会自己推断返回值,此时的返回值是Int def add(x:Int, y:Int) = { x+y} 例2: 此时没有写返回值,也没有等号,无论函数内部有没有 ...