C++动态内存:(三) new-handler和set_new_handler
来源:互联网 发布:win10桌面软件不见了 编辑:程序博客网 时间:2024/06/06 08:07
一、函数说明
当operator new()找不到足够大的连续内存块来安排对象。new-handler函数将会被调用。
typedef void (*new_handler)();new_handler set_new_handler(new_handler p)throw();new_handler是个typedef,定义出一个指针指向函数,该函数没有参数也不返回任何东西。set_new_handler则是设置新的new_handler并返回当前的new_handler。当operator new()无法分配内存足够内存时新设置的new_handler被调用。
二、使用说明
1、如果set_new_handler()的参数设置为0(即没有安装任何new_handler),operator new会在内存分配不成功时抛出异常。
2、可以将set_new_handler函数中的参数p设为0,来获取当前的new_handler;
#include<iostream>using namespace std;void outofMem(){abort();}int main( ){new_handler p=set_new_handler(outofMem);new_handler p1=set_new_handler(0);cout<<outofMem<<" "<<p1<<endl;return 0;}
3、当operator new无法满足内存申请时,它会不断调用new_handler函数,直到找到足够内存或者退出。因此new_handler函数必须至少做以下事情之一或者组合:
(1)让更多内存可被使用:可以在程序一开始执行就分配一大块内存,然后new-handler第一次被调用时,将它们还给程序使用。
(2)安装另一个new_handler。如果当前的new_handler无法获取更多内存,它可以安装另外具有此能力的new_handler.
(3)卸除new_handler。将null指针传给set_new_handler()。这样在operator new内存分配不成功时会抛出异常。
(4)抛出bad_alloc(或派生自bad_alloc的异常)
(5)不返回。调用abort或者exit。
4、C++不支持类专属的new_handlers。因此如果想要让类对象内存分配错误时调用自己的new_handler,可以给类提供自己的set_new_handler和operator new。
5、new-handler的行为于operator new()绑在仪器,如果已经重载了operator new(),则new-handler将不会按默认调用。如果仍想调用new-handler则我们必须在重载了的operator new()的代码中加上这些工作的代码。
参考资料:
1、《C++编程思想》
2、《Effective C++》
- C++动态内存:(三) new-handler和set_new_handler
- c++:动态内存分配(new和delete的使用)
- 【C++】动态内存管理(new,delete,new[],delete[])
- c++动态内存分配(new/new[]和delete/delete[])
- C++内存管理:new的实现以及模拟set_new_handler机制
- 【C++】动态内存管理(一)成对使用new和delete时要采取相同形式
- 内存泄漏之内部类new Handler();
- Handler基本使用(一) new Handler()和new Handler(Handler.Callback)
- C++动态内存:(二)重载new和delete
- 动态管理内存之new和delete
- C++primer 4.3 动态数组 、 动态内存分配 new delete
- 从java到C++——new和delete的动态内存管理
- set_new_handler C++ new分配失败
- set_new_handler C++ new分配失败
- 内存分配:new的三种方法-new expression、operator new和placement new
- C语言快速讲解(三)动态内存分配
- 类和动态内存分配,类成员的动态内存分配,new,delete,定位new
- Handler new Handler()和new Handler(Looper.getMainLooper())的区别
- php开发环境集成
- Lucene教程地址
- R-table和tapply函数
- Union-Find问题
- OSG学习笔记19——再看pick点选物体
- C++动态内存:(三) new-handler和set_new_handler
- CentOS6.5配置 cron 任务
- Eclipse 安装 SVN 插件的两种方法
- Python PyQuery的用法
- java使用移位运算进行进制转化
- 使用DashPathEffect绘制一条动画曲线
- cnpm不是内部或外部命令 cnpm: command not found 解决方案 cnpm
- javascript之你要懂得规则
- zstuoj 4274 约素