《Effective C++》定制new和delete
Item49:了解new_handler的行为
当operator new抛出异常以反映出一个未获得满足的内存需求之前,它会先调用一个用户制定的错误处理函数,一个所谓的new-handler,为了制定这个“用以处理内存不足”的函数,用户必须调用set-new-handler,那是声明于中的一个标准程序库函数:
namespace std{
typedef void(*new_handler)();
new_handler set_new_handler(new_handler p) throw();//这里是nothrow吗?书中是throw
}
new_handler是个typedef,定义出一个指针指向一个函数,这个函数没有参数也不反悔任何东西,set_new_handler则是获得一个new_handler并且返回一个new_handler的函数,set_new_handler声明式尾端的”throw()”是一份异常明细,表明该函数不抛出任何异常(是不是nothrow?)
set_new_handler的参数也是个指针,指向operator new无法分配足够内存时候该被调用的函数,其返回值也是个指针,指向set_new_handler被调用前正在执行(但马上就要被替换)的那个new_handler函数,例如:
void outofMem()
{
std::cerr<<"无法分配内存";
std::abort();
}
int main()
{
std::set_new_handler(outofMem);
int * pBigDataArray=new int[100000000L];
}
一个涉及良好的new-handler函数必须做到以下事情:
- 让更多内存可被使用,实现策略是,程序一开始执行就分配一大块内存,而后当new_handler第一次被调用,将它们释还给程序使用。
- 安装另一个new_handler,如果这个new_handler无法获取更多可用内存,它可以自己调用set_new_handler来将其它函数来替换自己。
- 删除new_handler,也就是将null指针传给set_new_handler,一旦没有安装任何new_handler,operator new会在内存分配不成功时候抛出异常。
- 抛出bad_alloc异常,这样的异常不会被operator new捕捉,因此会传播到内存需求处。
不反悔,通常调用abort()或者exit()
nothrow new是一个颇为局限的工具,因为它只适用于内存分配,后继的构造函数调用还是可能抛出异常。
Item50:了解new和delete的合理替换时机
在什么情况下会需要替换new和delete?
- 用来检测运行上的错误。
- 为了提高性能。
- 为了收集使用上的统计数据。
- 为了增加分配和归还的速度。
- 为了降低缺省内存管理器带来的空间额外开销。
- 为了尼姆缺省分配器中的非最佳齐位。
- 为了将相关对象成簇集中。
- 为了获得非传统行为。
Item51:编写new和delete时需固守成规
总结:①operator new应该内含一个无穷循环,并且其中尝试分配内存,如果它无法满足内存需求,就应该调用new_handler,它也应该有能力处理0字节申请。
②operator delete应该在收到null指针时候不做任何事情
《Effective C++》定制new和delete的更多相关文章
- Effective C++ —— 定制new和delete(八)
STL容器所使用的heap内存是由容器所拥有的分配器对象管理,不是被new和delete直接管理.本章并不讨论STL分配器. 条款49 : 了解new-handler的行为 当operator new ...
- 高效C++:定制new和delete
内存的申请和释放,C++从语言级别提供了new和delete关键字,因此需要了解和熟悉其中的过程. 了解new-handler的行为 set_new_handler可以指定一个函数,当申请内存失败时调 ...
- 【effective c++】定制new和delete
条款49: 了解new-handler的行为 operator new 和 operator delete只适合用来分配单一对象.array所用的内存由operator new[]分配出来,并由ope ...
- Effective C++: 08定制new和delete
49:了解new-handler的行为 当operator new无法满足某一内存分配需求时,它会抛出异常(以前会返回一个null).在抛出异常之前,它会调用一个客户指定的错误处理函数,也就是所谓的n ...
- 《Effective C++》定制new和delete:条款49-条款52
条款49:了解new-handler的行为 当operator new无法分配出内存会抛出异常std::bad_alloc 抛出异常前会反复调用用户自定义的new-handler函数直至成功分配内存 ...
- 八、定制new和delete
条款49:了解new-handler的行为 new异常会发生什么事? 在旧式的编译器中,operator new分配内存失败的时候,会返回一个null指针.而现在则是会抛出一个异常. 而在抛出这个异常 ...
- 《Effective C++》读书摘要
http://www.cnblogs.com/fanzhidongyzby/archive/2012/11/18/2775603.html 1.让自己习惯C++ 条款01:视C++为一个语言联邦 条款 ...
- 《Effective C++》 阅读小结 (笔记)
A person who is virtuous is also courteous. "有德者必知礼" 书本介绍:<Effective C++:改善程序与设计的55个具体做 ...
- C++ delete 和 delete []
C++ delete 和 delete [] 简单结论: new delete new [] delete [] 文章 : 对 delete [] 的声明 void operator delete ...
- effective c++ 思维导图
历时两个多月的时间,终于把effective c++又复习了一遍,比较慢,看的是英文版,之前看的时候做过一些笔记,但不够详细,这次笔者是从头到尾的翻译了一遍,加了一些标题,先记录到word里面,然后发 ...
随机推荐
- AIR32F103(四) 27倍频216MHz,CoreMark跑分测试
目录 AIR32F103(一) 合宙AIR32F103CBT6开发板上手报告 AIR32F103(二) Linux环境和LibOpenCM3项目模板 AIR32F103(三) Linux环境基于标准外 ...
- SQL--存储过程的使用
存储过程的概念 存储过程类似一个函数,可以执行一条或者多条SQL语句,可带参数,可返回值 为了简化操作,方便更改和扩展,将一个事件的处理封装在一个单元中供使用. 创建存储过程 --创建存储过程(不带参 ...
- 1.WEB应用模式
1. Web应用模式 在开发Web应用中,有两种应用模式: 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的.] 前后端分离[把前端的界面效果(html,css,js分离到另一个服务 ...
- 词云(WordCloud)
WordCloud的参数: font_path:可用于指定字体路径 width:词云的宽度,默认为 400: height:词云的⾼度,默认为 200: mask:蒙版,可⽤于定制词云的形状: min ...
- pod(七):静态pod
目录 一.系统环境 二.前言 三.静态pod 3.1 何为静态pod 3.2 创建静态pod 3.2.1 使用--pod-manifest-path指定静态pod目录 3.2.2 静态pod默认目录/ ...
- 【Azure 环境】把OpenSSL生产的自签名证书导入到Azure Key Vault Certificate中报错
问题描述 通过本地生成的自签名证书导入到Azure Key Vault Certificate报错. 错误信息 the specified PEM X.509 certificate content ...
- Oracle性能优化之内存管理
Oracle实例中的内存使用分为两类:程序全局区(program global area, PGA)和系统全局区(system global area, SGA).前者专门供每个会话使用,后者由所有O ...
- Appscan的安装破解以及使用
本文简单介绍Appscan的安装和使用. 一.下载安装 可自行百度下载相关安装包(因较高版本的破解资料比较难找,建议下载9.0版本). 双击.exe安装文件进行安装,在弹出的安装指引中各选项默认安装即 ...
- 真正“搞”懂HTTP协议04之搞起来
前两篇文章,我们从空间和时间的角度都对HTTP有了一定的学习和理解,那么基于上一篇的HTTP发展的时间顺序,我会在后面的文章由浅入深,按照HTTP版本内容的更迭,一边介绍相关字段的使用方法,一边讲解其 ...
- python进阶(28)import导入机制原理
前言 在Python中,一个.py文件代表一个Module.在Module中可以是任何的符合Python文件格式的Python脚本.了解Module导入机制大有用处. 1. Module组成 一个.p ...