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函数必须做到以下事情:

  1. 让更多内存可被使用,实现策略是,程序一开始执行就分配一大块内存,而后当new_handler第一次被调用,将它们释还给程序使用。
  2. 安装另一个new_handler,如果这个new_handler无法获取更多可用内存,它可以自己调用set_new_handler来将其它函数来替换自己。
  3. 删除new_handler,也就是将null指针传给set_new_handler,一旦没有安装任何new_handler,operator new会在内存分配不成功时候抛出异常。
  4. 抛出bad_alloc异常,这样的异常不会被operator new捕捉,因此会传播到内存需求处。
  5. 不反悔,通常调用abort()或者exit()

    nothrow new是一个颇为局限的工具,因为它只适用于内存分配,后继的构造函数调用还是可能抛出异常。


Item50:了解new和delete的合理替换时机

在什么情况下会需要替换new和delete?

  1. 用来检测运行上的错误。
  2. 为了提高性能。
  3. 为了收集使用上的统计数据。
  4. 为了增加分配和归还的速度。
  5. 为了降低缺省内存管理器带来的空间额外开销。
  6. 为了尼姆缺省分配器中的非最佳齐位。
  7. 为了将相关对象成簇集中。
  8. 为了获得非传统行为。

Item51:编写new和delete时需固守成规

总结:①operator new应该内含一个无穷循环,并且其中尝试分配内存,如果它无法满足内存需求,就应该调用new_handler,它也应该有能力处理0字节申请。

②operator delete应该在收到null指针时候不做任何事情

最新文章

  1. C++随笔:.NET CoreCLR之corleCLR核心探索之coreconsole(2)
  2. hdu2457DNA repair(ac自动机+dp)
  3. sql 查看 锁定的表 或者 未提交 的事务
  4. Mac 配置jdk
  5. Android调试工具及方法
  6. 最大公约数(Greatest Common Divisor)
  7. v-for并判断当前元素是否选中:$set实现响应添加属性
  8. ASP.NET Core中使用表达式树创建URL
  9. (一)shell脚本入门
  10. Vue-Router路由Vue-CLI脚手架和模块化开发 之 vue-router路由
  11. Netty(一)——Netty入门程序
  12. java 第二天运算符及录入函数Scanner
  13. C# byte[]数组和string的互相转化 (四种方法)
  14. php+redis配置
  15. VMware5.5-vCenter的安装准备及安装
  16. Android提供的layout文件存放位置
  17. scipy优化器optimizer
  18. 【转载】和 Thrift 的一场美丽邂逅
  19. Lua报错:invalid key to &#39;next&#39;
  20. tomcat启动startup.bat一闪而过的问题处理方式

热门文章

  1. misc办公室爱情
  2. 使用LEFT JOIN 统计左右存在的数据
  3. 如何通过 C#/VB.NET 重命名 Excel 表格并设置选项卡颜色
  4. windows下 安装docker
  5. 2022,一个Java程序猿的外设配置
  6. java学习之springboot
  7. Bitmap和byte[]的相互转换
  8. K8Snode节点管理集群资源方法
  9. 2022春每日一题:Day 23
  10. SQL-GROUP BY语句在MySQL中的一个错误使用被兼容的情况