当 operator new 中malloc返回值为0(NULL)时,表示分配内存失败(可能是因为内存不足),

此时会通过_callnewh()调用用户通过set_new_handler()设定的new_handler(),用于处理错误情况。

(一般用于回收已分配内存?)

它长成这样

namespace std{
typedef void (*new_handler){ };//一个函数指针
new_handler set_new_handler(new_handler p) throw();
};

下面是一个小栗子

#include<iostream>
using namespace std;
void out_of_memory() {
cerr << "Out of memory!!" << endl;
abort();
}
int main() {
set_new_handler(out_of_memory);
while (1) {
new int[1000];
}
}

运行后打印"Out of memory!!"。

怎样设计一个性能优良的new_handler

  • 让更多的内存被使用。这样做的目的很简单,就是为了内存能够尽可能被operator new进行分配。实现此要求的做法是,当new_handler被调用的时候,将之前分配的内存释放给程序,以便能够继续使用。
  • 安装新的new_handler。如果当前的new_handler无法取得更多的内存,那么这个new_handler应该能够安装新的new_handler以便能够获得更多的内存空间。
  • 卸载new_handler,也就是将null指针传给set_new_handler。这样的话,一旦没有分配成功,就会抛出异常。
  • 抛出bad_alloc的异常。这样的异常不会被operator_new捕捉,因此会被传播到内存索求处。
  • 不返回。通常会调用abort或者exit。

原文在此

最新文章

  1. 20161106PM-接口
  2. CSS3--box-shadow
  3. 【荐】Spring事务配置的五种方式
  4. 字节流、字符串、16进制字符串转换__Java(转)
  5. OpenJudge 取数游戏
  6. java web servlet
  7. JSONP(转)
  8. 浙大 pat 1024题解
  9. iOS-swift-基础篇1
  10. SQL Server——存储过程
  11. 检测linux vps是xen openvz还是kvm的方法
  12. Ubuntu 13.04设置root用户登录图形界面
  13. .NET之JSON序列化运用
  14. (Python3) 求中位数 代码
  15. 插头dp初探
  16. 简述openstack
  17. QCon2019全球软件开发大会广州站即将来袭
  18. typescritp 导出默认接口
  19. C# 解构
  20. python学习笔记Day2

热门文章

  1. [Objective-C] 016_UI篇_UIView(上)
  2. Nuxt.js
  3. Alpha冲刺 —— 5.2
  4. Rocket - jtag - JtagTap
  5. Chisel3 - Tutorial - Stack
  6. JAVA实现对称加密
  7. Java实现 LeetCode 572 另一个树的子树(遍历树)
  8. Java实现 洛谷 P1015 回文数(N进制回文数)
  9. Java中多态举例说明
  10. HTML 5的革新——语义化标签section和article的区别