【49】了解new_handler的行为
1、使用operator new无法获取内存时,对于旧式编译器,会返回一个null指针。对于新式编译器,会抛出一个异常。
2、考虑下面的需求,当operator new 无法获取内存时,程序员期望获得通知,并调用一个方法。也就是说,向系统传递一个回调方法。这就是new_handler:
typedef void (* new_handler) (void); new_handler是一个指针方法,形参为空,没有返回值。
new_handler set_new_handler(new_handler p) throw ();
set_new_handler 方法就是传递一个回调方法,返回老的回调方法。
3、new_handler 的意思就是说,当使用operator new 无法分配内存时,转交给用户,用户来做一些事情。new_handler 要做下列事情:
a、提供更多内存可供使用;
b、安装另一个new_handler,调用另一个方法;
c、卸载new_handler,这时会抛出异常;
d、抛出bad_alloc异常;
e、不返回,调用abort或者exit。
4、C++并不支持class专属的new_handler。也就是说,程序员期望,对于不同的class,在堆上分配对象无法获取内存时,可以做不同的事情,但是C++不支持class专属的new_hanlder,也就是说,所有的operator new 共享new_handler,那该怎么办?
想法是:分配Widget对象之前,安装Widget的new_handler,分配成功后,卸载Widget的new_handler。
5、为了保证能够卸载成功,需要使用资源管理类,对老的new_handler管理,析构的时候,重新指向老的new_handler。
6、为了可以支持不同class,建立一个模板类,并且把set_new_handler有关的代码上移到父类,具体的类继承类模版。
【49】了解new_handler的行为的更多相关文章
- 《Effective C++(第三版)》-笔记
1. 让自己习惯C++ 条款01: 视C++为一个语言联邦 1.1 C++ 是一个多重泛型编程语言(multiparadigm programming),支持:过程形式(procedural),面向对 ...
- EC读书笔记系列之19:条款49、50、51、52
条款49 了解new-handler的行为 记住: ★set_new_handler允许客户指定一个函数,在内存分配无法获得满足时被调用 ★Nothrow new是一个颇为局限的工具,∵其只适用于内存 ...
- c++中的set_new_handler和new_handler
当operator new申请一个内存失败的时候,它会进行如下的处理步骤: 1.如果存在客户指定的处理函数,则调用处理函数(new_handler),如果不存在则抛出一个异常. 2.继续申请内存 ...
- 49. 3种方法实现复杂链表的复制[clone of complex linked list]
[本文链接] http://www.cnblogs.com/hellogiser/p/clone-of-complex-linked-list.html [题目] 有一个复杂链表,其结点除了有一个ne ...
- chrome浏览器的跨域设置——包括版本49前后两种设置
做前后分离的webapp开发的时候,出于一些原因往往需要将浏览器设置成支持跨域的模式,好在chrome浏览器就是支持可跨域的设置,网上也有很多chrome跨域设置教程.但是新版本的chrome浏览器提 ...
- PHP5.3.3+Apache2.2.16+MySQL5.1.49
轻松配置PHP5.3.3+Apache2.2.16+MySQL5.1.49,下面是有详细的步骤说明. 第一步:下载安装的文件 1. MySQL:下载地址mysql-5.1.49-win32.msi ...
- LeetCode - 49. Group Anagrams
49. Group Anagrams Problem's Link ------------------------------------------------------------------ ...
- CodeForce Round#49 untitled (Hdu 5339)
Untitled Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- glib-2.49.4-msys-x86-staticLib.7z
glib-2.49.4 MSYS 静态库 编译 export LIBFFI_CFLAGS=" -I/usr/local/lib/libffi-3.2.1/include " \ e ...
随机推荐
- 如何查看你的 memcached 的状态
最近略忙,好久没有更新博客了,已长草,今天来除下草,好了,不废话了,开始! 现在很多web服务都会用到 memcached ,如何知道你的 memcached 是否正常工作,命中率如何呢,本文简单介 ...
- C语言中的位拷贝与值拷贝浅谈(转载)
注:C语言实现的PHP变量的赋值过程中,就涉及到了 深拷贝和浅拷贝 位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝).深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象 ...
- windows官方多语言方案
编写 Win32 多语言用户界面应用程序 Windows 2000 针对全球市场制定了新的增强支持标准,提供了许多国际化功能,例如完全支持 Unicode.预设支持数百种语言以及用于从右向左语言的镜像 ...
- Skyline学习教程
转自:http://yunjinzh.blog.sohu.com/165279318.html 当初开设这个blog的初衷就是将PPT与专业技术进行结合 将专业技术的介绍更加艺术化 但是之前一直都没有 ...
- CF GYM 100703G Game of numbers
题意:给n个数,一开始基数为0,用这n个数依次对基数做加法或减法,使基数不超过k且不小于0,输出最远能运算到的数字个数,输出策略. 解法:dp.dp[i][j]表示做完第i个数字的运算后结果为j的可能 ...
- UESTC 250 windy数(数位DP)
题意:题意:求区间[A,B]之间的,不含前导0,且相邻两数位之间相差至少为2的正整数有多少个. 分析:dp[i][j]表示,长度为i.以j为结尾的表示的个数,再加一个前导0判断即可 #include ...
- 每天学点linux命令--tail,cut,sort,uniq
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新, ...
- 关于Excel中的需求或者是用例导入到QC中遇到的问题
Excel 中导入用例到QC时,会提示如图所示的错误信息: 解决方案: 我的电脑-->属性->高级-->性能设置-->添加QC程序
- unity3d实现序列帧动画
首先准备一个序列帧图片如下的AngryBird: 场景中随便创建一个物体,这里以Cube为例 将图片拖放到Cube上,这样会在Cube的6各面都有3个bird,为了美观显示一个鸟,我们调整材质的Til ...
- 关于hibernate映射过程中的笔记
MySQL遇到check the manual that corresponds to your MySQL server version for the right syntax错误 You hav ...